是否有可能确定源文件是否由于#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
文件可以完全解决这个问题,并且在几乎所有情况下都是正确的。但由于各种原因,我只想要一个源文件,可以用作主模块源文件和其他模块的头文件。
答案 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.h
和foo.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
可以使用未定义的宏,并将它们视为零。