首页 > 解决方案 > 连接预处理器定义和字符串以创建#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。

任何想法,将不胜感激!

标签: c++visual-c++visual-studio-2015c-preprocessor

解决方案


有两件事导致您的问题。

  1. 你正试图"A" "B"变成"AB".
  2. #include "A""B"不是有效的语法。

您可以做的是连接AB然后将其转换为字符串文字。

#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"因此,您必须使用不带引号的标记并在最后对结果进行字符串化。


推荐阅读