【发布时间】:2020-11-13 21:34:51
【问题描述】:
我正在尝试包含一个名称取决于版本的头文件。具体名称 由字符串与版本号的串联给出。最后一个被找回 从 CMakeLists.txt 使用配置文件。
#include "config.h" # load PROJECT_VER
#define HEADERROOT "foo-"
#define HEADERBASENAME HEADERROOT PROJECT_VER
#define HEADER HEADERBASENAME ".h"
// Equivalent to: #define HEADER "foo-5.1.h"
生成的字符串是正确的,但是不能包含它(附加到前面的语句)
#include HEADER
#include <iostream>
using namespace std;
int main() {
cout << HEADER << endl;
return 0;
}
错误是
main.cpp:6:10: warning: extra tokens at end of #include directive
#include HEADER
^~~~~~
main.cpp:6:16: fatal error: foo-: No such file or directory
#include HEADER
^
compilation terminated.
【问题讨论】:
-
是的,因为
#include中的东西不是字符串 -
你要么想办法绕过不同的名称,要么用 bash 脚本或其他东西生成名称。
-
您必须从一开始就将整个文件名存储在一个宏中。
-
您的方法的一个问题是预处理器是编译的第 4 阶段,而相邻字符串文字的连接是第 6 阶段。因此,为此目的,
#define HEADER "foo-" "5.1" ".h"不是 相当于#define HEADER "foo-5.1.h"。 (嗯...我假设您隐含的问题是如何实现您的目标,而不是您的方法为何失败?如果该假设是错误的,我可以将此评论转换为答案。) -
我解决了它在
config.h.in中添加另一个#define和全名。
标签: c++ c cmake include c-preprocessor