【问题标题】:C++ defined ?macro? visible in header yet missing in implementation (linker reports unresolved external)C++ 定义的?宏?在标头中可见但在实现中缺失(链接器报告未解析的外部)
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我接受这个,因为这是我开始使用它的方式,即使我考虑@JohanessS。方法好一点,我发现自己懒得使用它
【解决方案2】:

您可以使用默认 value = nowUseTmp 向您的 tmp.cpp 函数添加附加参数(将其命名为 use_tmp)并检查它的特定行为值:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2012-05-30
    • 2012-02-08
    • 2019-01-16
    • 1970-01-01
    • 2014-12-02
    • 2012-04-24
    相关资源
    最近更新 更多