头文件宏声明和预处理器宏声明

时间:2018-01-05 16:48:35

标签: c c-preprocessor typedef

我是C的新手,所以请在低调之前帮我解答,这对我有很大的帮助。 头文件的定义表明 -

  

头文件由C函数声明和要在不同文件之间共享的宏定义组成。

C Preprocessor的定义表明 -

  

C预处理器是一个宏预处理器,它在编译之前转换程序。所有预处理程序指令都以#符号开头。

我的问题是macro declaration是在程序中使用#符号完成的,它是否依赖于包含或排除任何头文件,还包括如何查找特定文件是否具有预定义宏观宣言。 例如- 假设文件'ani.h'有一个宏声明, #define anii 2 那么,一旦我包含此文件,我就可以直接使用CNAMEanii

2 个答案:

答案 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很大。