【问题标题】:C preprocessor ResultC 预处理器结果
【发布时间】:2014-12-01 20:34:21
【问题描述】:

哪个结果会返回这个构造?我的意思是主函数中的结果变量,为什么? 我知道,这个例子很奇怪;)

header1.h 文件:

extern const int clf_1;

header2.c 文件:

#include    "header1.h"
const  int clf_1 = 2;

test.h 文件:

#include <header1.h>
#define xyz clf_1
#define NC_CON 2    
#if (xyz== NC_CON)
#define test 40
#else
#define test 41
#endif

C 文件

#include <header1.h>
#include <test.h>
    int main(int argc,char *argv[])
    {
       int result = 0:
        if (test == 40)
        {
             result  = 40;
        }
    }

【问题讨论】:

  • 运行gcc -C -E yoursource.c找出答案
  • 是的,我做到了,结果是 41,但我预计是 40,因为 xyz == clf_1 和 clf_1 == 2

标签: c if-statement header c-preprocessor ansi


【解决方案1】:

阅读C preprocessor 上的维基页面和GNU cpp 的文档(GCC 内部的预处理器,即由gccg++ 等运行...)。它是一个文本的东西,它在定义const int clf_1 = 2; 被编译器处理之前运行。 #if 指令只有在其中出现的所有名称都是预处理器符号时才有意义(使用#define-D 定义,在GCCClang/LLVM 的命令行上传递编译器)

使用gcc -C -E yoursource.c &gt; yoursource.i(在gcc之后还有一些其他选项,可能需要-I.......你应该#include "header1.h" 等等...)然后使用编辑器或寻呼机查看生成的yoursource.i(预处理表单)

如果 C 预处理器转换 ASTs,世界将会大不相同;由于历史原因,第一个 C 预处理器是文本过滤器(作为不同的程序运行)。

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2012-06-29
    • 2011-07-02
    • 2014-02-26
    相关资源
    最近更新 更多