c++ - 连接预处理器定义和字符串以创建#include 路径
问题描述
我正在尝试使用预处理器定义(在本例中为项目路径)和文件名连接头文件的文件路径,但我不断收到以下信息:“警告 C4067:预处理器指令后出现意外标记 - 预期换行”。我尝试了以下方法:
#define RESOURCE_PATH PROJECT_DIRECTORY "resource.h"
#include RESOURCE_PATH
和:
#define RESOURCE_FILE "resource.h"
#define RESOURCE_PATH PROJECT_DIRECTORY RESOURCE_FILE
#include RESOURCE_PATH
两者都产生警告 C4067 就#include
行了。我也试过:
#define RESOURCE_FILE "resource.h"
#define RESOURCE_PATH PROJECT_DIRECTORY ## RESOURCE_FILE
#include RESOURCE_PATH
这也不起作用,但将错误更改为“错误 C2006:'#include':预期文件名,找到'标识符'”。
我已经仔细检查了我的源文件是 UTF-8,所以我不会无意中包含 Unicode 字符。PROJECT_DIRECTORY 似乎格式正确并且是正确的路径。
我正在使用VS2015。
任何想法,将不胜感激!
解决方案
有两件事导致您的问题。
- 你正试图
"A" "B"
变成"AB"
. #include "A""B"
不是有效的语法。
您可以做的是连接A
,B
然后将其转换为字符串文字。
#define STR_IMPL(A) #A
#define STR(A) STR_IMPL(A)
然后你可以这样做:
#define RESOURCE_FILE resource.h
#define PROJECT_DIRECTORY /foo/bar
#define RESOURCE_PATH STR(PROJECT_DIRECTORY/RESOURCE_FILE)
#include RESOURCE_PATH
不幸的是,没有办法在 C++ 预处理器中"A"
转换A
或"A""B"
转换。"AB"
因此,您必须使用不带引号的标记并在最后对结果进行字符串化。
推荐阅读
- c# - 如果Builder Pattern从数据库值而不是参数输入构造对象是否合适
- mysql - Q1&Q2的sql查询?
- typescript - 索引类型和泛型函数值
- java - Java RMI 类 com.sun.proxy.$Proxy0 不能转换为类 client.MessageServerInt
- c++ - MPI 结果文件全部转到 .o 文件 [文件 i/o 错误]
- java - 获取具有多个属性的枚举列表并将它们放入 ArrayList 或 HashMap?
- webpack - webpack-dev-server 并不总是重新编译,rsync 问题
- sql - id 在列表中时的 SQL 高效复杂过滤
- java - 为什么我的错误我的异常处理会导致无限循环?
- android - 用户登录流行的移动应用程序和会话管理