C ++对外部#define做出反应

时间:2019-07-23 20:12:27

标签: c++ include header-files preprocessor-directive

可以使用包含之前的定义使glfw3-library包含vulkan:

#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>

我想做类似的事情,但要调试与非调试模式。 我尝试了以下方法:

main.cpp:

#define DEBUG_ENABLED
#include "someFile.hpp"

someFile.hpp:

#ifdef DEBUG_ENABLED
  std::vector<const char*> _debugExtensions = {
    VK_EXT_DEBUG_UTILS_EXTENSION_NAME
  };
#endif
#ifndef DEBUG_ENABLED
  std::vector<const char*> _debugExtensions = {};
#endif

我通过打印向量的大小来检查跨头文件的“定义传递”是否可行,但是收到零,这表明编译器没有不要认为DEBUG_ENABLED是在someFile.hpp中定义的。

然后,我查看了stackoverflow以查看我如何对extern文件的定义做出反应,并找到了这篇文章:

Is it possible to use #define from other cpp file?

那里接受的答案声称

其他翻译单元看不到源文件中的定义。实现文件是单独编译的。

我对这个答案的问题是,我的经验告诉我相反,正如上面提到的包含的glfw 明显地对我所做的GLFW_INCLUDE_VULKAN定义有反应。
一个人怎么可能实现这种行为(能够对外部源文件中的定义做出反应)?

1 个答案:

答案 0 :(得分:-1)

要求我创建一个“最小可复制示例”。
此示例表明问题确实与我假设的问题不同。
示例成功完成了的错误,但有助于回答了我最初的部分问题。

不要认为这是一个好的解决方案!提供此示例只是为了阐明cpp的行为,而不是作为在项目中实施的解决方案!

main.cpp:

#define DEBUG_ENABLED
#include "someFile.hpp"

int main() {
    Test test = Test();
    test.doCount();

    return 0;
}

someFile.hpp

#pragma once

#include <vector>

class Test {
public:
    #ifdef DEBUG_ENABLED
        std::vector<const char*> _debugExtensions = {
            "one",
            "two"
        };
    #endif
    #ifndef DEBUG_ENABLED
        std::vector<const char*> _debugExtensions = {};
    #endif

    void doCount();
};

someFile.cpp:

#include <stdio.h>

#include "someFile.hpp"

void Test::doCount() {
    printf("count: %lu", _debugExtensions.size());    
}

编译,并使用:

g++ -g main.cpp someFile.cpp -o out
./out

表明定义实际上在包含的头文件中获得了预处理程序指令来做出相应的反应。 错误行为(由注释指出)是由标题的不同包含导致的,其中只有一个子集定义了DEBUG_ENABLED。

这里的示例仍然容易出现问题!

(向人们发表评论)
解决方案有多种可能性:

  1. 使用编译器定义相关常量,如下所示:
g++ -DDEBUG_ENABLED
  1. 确保具有行为依赖于此类常量的定义的文件仅从单个转换单元中包含,或就常量的定义而言,所有转换单元均保持一致。这几乎排除了保留单独的.h(.hpp)和.cpp文件的可能性。