C ++定义了?宏?在标题中可见但在实现中丢失(链接器报告未解析的外部)

时间:2014-01-26 13:35:05

标签: c++ scope linker macros c-preprocessor

我有一些用于特定调试目的的类,所以我只在对给定功能感兴趣时使用它

在不需要时防止源垃圾,我试图通过预处理器处理它, 所以结构是这样的:

===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 include之前),链接器报告未解析的外部(如果宏在头中定义而未在cpp文件中定义)

问题: 为什么/如何/什么是更好的方法

我希望cpp文件是单独翻译的,不知道包含链(因此无法获得有关定义的信息)

是这样的吗? 如果是这样,如何解决方法,所以我可以在多个项目之间有不断的“tmp。*”文件,并且每个项目单独管理启用/禁用(即不使用相关标题内的定义)

只是为了澄清

- >当我在相关标题(tmp.h)中放置“#define tmpUseNow”时,一切正常

- >相关定义文件(tmp.cpp)中包含相关标题(tmp.h)

- >使用简化项目测试相同的行为,只有三个文件,例如

- >假设相关文件(tmp.h,tmp.cpp)是在许多项目之间共享的常量文件(因此我没有看到如何命令它们包含带有定义的预定第三个文件,这对于使用它们的项目是个体的)

2 个答案:

答案 0 :(得分:1)

是的,每个cpp文件都是独立处理的。如果我是你,我会确保在tmp.cpp中包含tmp.h,并且我只在tmp.h中定义nowUseTmp。

答案 1 :(得分:1)

您可以使用默认 { "typescript.tsdk": "./node_modules/typescript/lib" } 添加到您的 tmp.cpp 函数(将其命名为 use_tmp)附加参数并检查它的特定行为值:

tmp.h :

value = nowUseTmp

tmp.cpp :

/* takes par2 value from the define */
void use_tmp(int par1, int par2 = nowUseTmp);