可以使用包含之前的定义使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定义有反应。
一个人怎么可能实现这种行为(能够对外部源文件中的定义做出反应)?
答案 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。
这里的示例仍然容易出现问题!
(向人们发表评论)
解决方案有多种可能性:
g++ -DDEBUG_ENABLED