我是C的新手,所以请在低调之前帮我解答,这对我有很大的帮助。 头文件的定义表明 -
头文件由C函数声明和要在不同文件之间共享的宏定义组成。
C Preprocessor
的定义表明 -
C预处理器是一个宏预处理器,它在编译之前转换程序。所有预处理程序指令都以
#
符号开头。
我的问题是macro declaration
是在程序中使用#
符号完成的,它是否依赖于包含或排除任何头文件,还包括如何查找特定文件是否具有预定义宏观宣言。
例如-
假设文件'ani.h'有一个宏声明,
#define anii 2
那么,一旦我包含此文件,我就可以直接使用CNAME
即anii
?
答案 0 :(得分:0)
虽然它们可以用来做一些不错的元编程技巧以及条件编程,但最基本的用途是让程序员通过语法糖更容易生活。在编译代码之前,预处理器模块将用它们代表的术语替换所有宏,因此您定义的所有内容必须在宏<<>首次使用的点之上的某处声明。所以如果您这样做:
#include <stdio.h>
#include <math.h>
#define MY_MACRO(x) for(int i=0; i<(x); ++i) printf("%d\n", func((x),i);
int func(int n, int m) {return pow(n, m);}
int main()
{
int a = 10;
MY_MACRO(a)
return 0;
}
预处理器将通过之后定义的循环替换代码中出现的所有MY_MACRO。然后代码将被发送到编译。当编译器到达使用宏的行时,必须在此行的上方某处声明 printf 和 func ,就好像您在没有编写代码的情况下编写代码一样。宏。 (请注意, printf 和 pow 在定义之前包含的标头中声明,而 func 在定义之后声明,但它们之前声明了三个第一次使用宏。)
关于知道在某些lib中声明了哪些宏以及哪些宏未声明的问题,我认为唯一的方法是检查您正在使用的头文件或阅读他们的文档。但是,如果您知道某些特定的宏可能会声明,也可能不会声明,您可以使用以下代码对其进行测试:
#ifdef SOME_MACRO
printf("SOME_MACRO defined!\n");
#else
printf("SOME_MACRO not defined!\n");
#endif
答案 1 :(得分:0)
如果你从这个表单中查看预处理器实际执行的操作,就会更容易。
它读取文件并替换文本然后输出新文件。新文件将发送到编译器。预处理对C代码一无所知,它只是一个文本处理引擎
#include xxxx
说,'用该文件的内容替换此行'
#define FOO BAR
说,'每当你看到FOO用BAR替换它
还有一些简单的条件:#if
等
宏只是FOO BAR的替代品,通常FOO很小而BAR很大。