【发布时间】:2014-01-26 13:35:04
【问题描述】:
我有一些用于特定调试目的的类,所以我只在对给定功能感兴趣时才使用它
为了防止不需要的源垃圾,我尝试通过预处理器来处理它, 所以结构是这样的:
===main.cpp===
#define nowUseTmp
#include "tmp.h"
/*normal code which accesses tmp via macros*/
===EOF===
===tmp.h===
#ifdef nowUseTmp
/* class declaration */
/* macros to use static methods on class*/
#else
/*empty macro variants, so they may freely stay in code where needed*/
#endif
===EOF===
===tmp.cpp===
/*EXPECTED PLACE OF PROBLEM*/
#ifdef nowUseTmp
/* definitions */
#endif
===EOF===
问题是,当我启用 nowUseTmp(在 the_very_first/each 包含之前)时,链接器会报告未解析的外部(例如宏是在标头中定义的,而不是在 cpp 文件中定义的)
问题: 为什么/如何/什么是更好的方法
我希望 cpp 文件是单独翻译的,而不知道包含链(因此无法获得有关定义的信息)
是这样吗? 如果是这样,如何解决,这样我就可以在多个项目之间拥有恒定的“tmp.*”文件,并为每个项目单独管理启用/禁用(即不要在相关标头中使用定义)
澄清一下
->当我将“#define tmpUseNow”放在相关标题 (tmp.h) 中时,一切正常
->相关头文件(tmp.h)包含在相关定义文件(tmp.cpp)中
->使用简化项目测试的行为与示例相同,只有三个文件
-> 相关文件(tmp.h,tmp.cpp)被假定为许多项目之间共享的常量文件(所以我不知道如何命令它们包含带有定义的预定第三个文件,这对于使用的项目来说是单独的他们)
【问题讨论】:
-
不要在源文件中定义
nowUseTmp,而是将其传递给编译器,例如-D nowUseTemp用于 GCC 或将其添加到 Visual Studio 中的项目设置中。
标签: c++ scope linker macros c-preprocessor