C 定义了?宏?在标题中可见但在实施中缺少(Linker报告未解决的外部)

C++ defined ?macro? visible in header yet missing in implementation (linker reports unresolved external)

本文关键字:Linker 报告 未解决 施中缺 外部 定义 标题      更新时间:2023-10-16

我有一些用于特定调试目的的类,因此我仅在对给定功能感兴趣的时候才使用它

为了防止源垃圾在不需要时,我试图处理预处理程序,因此结构就是这样:

===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/envernable之前)时,链接器报告未解决的外部(例如,如果在标题中定义了宏,并且未在CPP文件中定义)

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

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

是这样吗?如果是这样,如何解决方法,因此我可以在多个项目之间使用恒定的" TMP。

只是为了澄清

->当我将" #define tmpusenow"放置在相关标头(TMP.H)内部时,所有这些都可以正常工作

->相关标头(TMP.H)来自相关定义文件(TMP.CPP)

->与简化项目一起测试的相同行为,仅与示例

中的三个文件一起测试

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

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

您可以将其添加到tmp.cpp函数(名称IT use_tmp)默认value = nowUseTmp的附加参数,并检查特定行为的IT值:

tmp.h:

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

tmp.cpp:

void use_tmp(int par1, int par2)
{
    if(!par2) /*do smth*/ return;
}