连接预处理器定义和字符串以创建#include 路径
Concatenating preprocessor definition and string to create #include path
我正在尝试使用预处理器定义(在本例中为项目路径)和文件名连接头文件的文件路径,但我一直得到以下信息:"warning C4067: unexpected tokens following preprocessor directive - expected a newline"。我尝试了以下方法:
#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
#include
行中的两个都产生警告 C4067。我也试过:
#define RESOURCE_FILE "resource.h"
#define RESOURCE_PATH PROJECT_DIRECTORY ## RESOURCE_FILE
#include RESOURCE_PATH
这也不起作用,但将错误更改为 "error C2006: '#include': expected a filename, found 'identifier'"。
我已经仔细检查过我的源文件是 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"
。因此,您必须使用不带引号的标记并在最后将结果字符串化。
我正在尝试使用预处理器定义(在本例中为项目路径)和文件名连接头文件的文件路径,但我一直得到以下信息:"warning C4067: unexpected tokens following preprocessor directive - expected a newline"。我尝试了以下方法:
#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
#include
行中的两个都产生警告 C4067。我也试过:
#define RESOURCE_FILE "resource.h"
#define RESOURCE_PATH PROJECT_DIRECTORY ## RESOURCE_FILE
#include RESOURCE_PATH
这也不起作用,但将错误更改为 "error C2006: '#include': expected a filename, found 'identifier'"。
我已经仔细检查过我的源文件是 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"
。因此,您必须使用不带引号的标记并在最后将结果字符串化。