C++ 连接预处理器定义和字符串以创建#包含路径

C++ 连接预处理器定义和字符串以创建#包含路径,c++,visual-c++,visual-studio-2015,c-preprocessor,C++,Visual C++,Visual Studio 2015,C Preprocessor,我试图使用预处理器定义(在本例中为项目路径)和文件名连接头文件的文件路径,但我始终得到以下信息:“警告C4067:预处理器指令后出现意外标记-需要换行符”。我尝试了以下方法: #define RESOURCE_PATH PROJECT_DIRECTORY "resource.h" #include RESOURCE_PATH 以及: #include行上的两个屈服警告C4067。我也尝试过: #define RESOURCE_FILE "resource.h" #define RESOURCE

我试图使用预处理器定义(在本例中为项目路径)和文件名连接头文件的文件路径,但我始终得到以下信息:“警告C4067:预处理器指令后出现意外标记-需要换行符”。我尝试了以下方法:

#define RESOURCE_PATH PROJECT_DIRECTORY "resource.h"
#include RESOURCE_PATH
以及:

#include
行上的两个屈服警告C4067。我也尝试过:

#define RESOURCE_FILE "resource.h"
#define RESOURCE_PATH PROJECT_DIRECTORY ## RESOURCE_FILE
#include RESOURCE_PATH
这也不起作用,但将错误更改为“error C2006:'#include”:应为文件名,找到“identifier”

我已经仔细检查了我的源文件是否为UTF-8,所以我没有无意中包含Unicode字符。PROJECT_目录似乎格式正确,路径正确

我正在使用VS2015


任何想法都将不胜感激

有两件事导致了你的问题

  • 您正试图将
    “A”“B”
    转换为
    “AB”
  • #包含“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++预处理器中,没有办法将< <代码> > <代码> > < <代码> >或>代码>“B”<代码> > <代码> AB“<代码> >。因此,您必须使用不带引号的标记,并在最后将结果字符串化。

    令我惊讶的是。我从来不知道
    #包含
    扩展宏。非常感谢您的帮助,它工作得很好!
    #define RESOURCE_FILE resource.h
    #define PROJECT_DIRECTORY /foo/bar
    #define RESOURCE_PATH STR(PROJECT_DIRECTORY/RESOURCE_FILE)
    
    #include RESOURCE_PATH