连接预处理器定义和字符串以创建#include路径

时间:2018-06-06 19:34:49

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

我正在尝试使用预处理器定义(在本例中为项目路径)和文件名来连接头文件的文件路径,但我一直在获得以下内容:"警告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

#include行上的产量警告C4067。我也尝试过:

#define RESOURCE_FILE "resource.h"
#define RESOURCE_PATH PROJECT_DIRECTORY ## RESOURCE_FILE
#include RESOURCE_PATH

也不起作用,但将错误更改为"错误C2006:' #include':预期文件名,找到'标识符'"。

我已经仔细检查过我的源文件是UTF-8,因此我不会无意中包含Unicode字符。 PROJECT_DIRECTORY似乎格式正确,路径正确。

我正在使用VS2015。

任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:2)

有两件事导致你的问题。

  1. 您正试图将"A" "B"变为"AB"
  2. #include "A""B"无效语法。
  3. 您可以做的是连接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"。因此,您必须使用没有引号的标记,并在结尾处对结果进行字符串化。