【问题标题】:Macro used in a .c file getting compiled without adding the header file in which it is defined.c 文件中使用的宏在不添加定义它的头文件的情况下被编译
【发布时间】:2014-01-02 08:27:07
【问题描述】:

我有一个大型项目,其中一些宏定义为:

#define RECORD_COUNT 141 // in one file file1.h

另一个文件说 file2.c 正在使用这个宏。但是file2.c不包括file1.h。

所以有没有可能在编译第一个文件时预编译是 file1.h 并且宏被添加到全局范围。这使得预编译file2.c成为可能?

【问题讨论】:

  • 它可能会通过其他包含间接包含在内。
  • “另一个文件说 file2.c 正在使用这个宏”是什么意思? “宏被添加到全局范围”是什么意思?宏扩展是在预处理阶段完成的——没有编译,没有作用域,一个文件无法判断另一个文件是否正在使用宏。
  • 我的意思是如果在一个文件(file1)中定义了一个宏,我相信预处理和编译是按照编译列表中提到的顺序进行的。因此,在这种情况下,宏在一个文件中定义并在另一个文件中使用,即使该文件不包含在内,预编译过程是否有可能替换第二个文件中的宏?????

标签: c macros header-files


【解决方案1】:

你的宏定义很可能在你使用它之前就已经编译好了。

只是为了检查您可以使用pragma message 来检查编译器是否接触了该代码。 http://msdn.microsoft.com/en-us/library/x7dkzch2.aspx

【讨论】:

    【解决方案2】:

    你不需要直接包含头文件来使用它。也可以有间接包含。

    例如,

    说 file1.h 有

    #define RECORD_COUNT 141
    

    file2.h 有,

    #include "file1.h"
    ...
    ...
    

    如果 file2.c 有 #include "file2.h" 那么,您可以在包含语句之后使用 file2.c 内 'file1.h' 中的任何宏或定义。

    【讨论】:

    • 不,在这种情况下没有发生分层包含。
    猜你喜欢
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2011-02-11
    • 1970-01-01
    • 2011-02-04
    • 2012-02-13
    相关资源
    最近更新 更多