是否可以判断C ++文件何时是主要源文件?

时间:2015-06-16 04:14:38

标签: c++ include c-preprocessor

是否有可能确定源文件是否由于#include语句而被预处理而不是由于它是传递给编译器的主要源文件而被预处理?

基本上,我希望能够写出如下内容:

// foo.x:
#if COMPILING_FOO_MODULE
/* FOO code that's only visible when compiling foo.x module */
#endif
/* FOO code that's visible when compiling foo.x module or included in other modules */

// bar.cpp:
#include "foo.x"
...

在预处理foo.x时,我希望将两部分代码传递给编译器,但在预处理bar.cpp时,我只想要使用第二部分:

// foo.x.preprocessed:
/* FOO code that's only visible when compiling foo.x module */
/* FOO code that's visible when compiling foo.x module or included in other modules */

// bar.cpp.preprocessed:
/* FOO code that's visible when compiling foo.x module or included in other modules */
...

我意识到我可以通过在#define COMPILING_FOO_MODULE 0之前添加#include轻松完成此操作,但我的目标是避免将#include之外的任何其他代码添加到bar.cpp 1}}文件。

包括,因为我认为答案对两者都是一样的。

修改

要明确的是,我知道有一个单独的.h.cpp文件可以完全解决这个问题,并且在几乎所有情况下都是正确的。但由于各种原因,我只想要一个源文件,可以用作主模块源文件和其他模块的头文件。

3 个答案:

答案 0 :(得分:2)

有一种方法可以完全按照自己的意愿行事。试试这个:

foo.c的

#if __INCLUDE_LEVEL__ == 0
/* FOO code that's only visible when compiling foo.x module */
#endif
/* FOO code that's visible when compiling foo.x module or included in other modules */

bar.c

#include <foo.c>
//other lines of code

请注意,宏 __ INCLUDE_LEVEL __ 是预定义的。它表示包含文件中嵌套的深度。

我希望这会有所帮助。

来源:https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html

答案 1 :(得分:0)

传统上这样做的方法是将foo.x分成两个文件:foo.hfoo.c(或foo.cpp)。

foo.h包含“在编译foo.x模块时可见或包含在其他模块中的FOO代码”foo.c / foo.cpp包含“ FOO代码仅在编译foo.x模块时可见“

foo.c / foo.cpp#include "foo.h",以便它有两组代码,bar.cpp也有#include "foo.h"

答案 2 :(得分:-1)

而不是

#define COMPILING_FOO_MODULE 0

在不是foo.cpp的文件中,请使用

#define COMPILING_FOO_MODULE 1
foo.cpp中的

,其他编译单元中没有任何内容。

#if可以使用未定义的宏,并将它们视为零。