【发布时间】:2019-07-23 20:12:27
【问题描述】:
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
我通过打印向量的大小检查了跨头文件的“传递定义”是否有效,但收到零,这表明编译器没有'不考虑在 someFile.hpp 中定义 DEBUG_ENABLED。
然后我查看了 stackoverflow 以了解我如何对外部文件的定义做出反应,并找到了这篇文章:
Is it possible to use #define from other cpp file?
那里接受的答案声称
其他翻译单元看不到源文件中的定义。实现文件单独编译。
我对这个答案的问题是我的经验告诉我相反,因为上面提到的包含的 glfw 清楚地对我所做的 GLFW_INCLUDE_VULKAN 定义做出了反应。
一个人如何能够实现这种行为(能够对外部源文件中的定义做出反应)?
【问题讨论】:
-
1.
VK_EXT_DEBUG_UTILS_EXTENSION_NAME是如何定义的? 2. 你能提供一个minimal reproducible example 来演示大小查询是哪个文件(以及如何)吗? -
你可能想在编译器命令行上定义你的常量——比如
-Dfoo.. -
我怀疑并非所有包含
someFile.hpp的cpp 都直接或间接定义了相同的东西。 -
我认为您将翻译单元与源文件混淆了,它们不是一回事。翻译单元是在所有
#includes已被包含文件替换(并且其他预处理已完成)之后的源文件。顺便说一句,您的示例应该有效,所以我认为您的代码还有其他问题。 -
另外,尝试标记您的全局
constexpr并使用std::array而不是矢量。这将使用常量初始化,因此不受初始化顺序问题的影响。
标签: c++ include header-files preprocessor-directive