【问题标题】:Concatenating preprocessor definition and string to create #include path连接预处理器定义和字符串以创建#include 路径
【发布时间】:2018-11-16 14:26:21
【问题描述】:

我正在尝试使用预处理器定义(在本例中为项目路径)和文件名连接头文件的文件路径,但我不断收到以下信息:“警告 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': expected a filename, found 'identifier'”。

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

我正在使用 VS2015。

任何想法都将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    有两件事导致您的问题。

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

    【讨论】:

    • 令我惊讶的是that works。我从来不知道#include 扩展了宏。
    • 非常感谢您的帮助,效果很好!
    猜你喜欢
    • 2017-04-02
    • 2015-06-18
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多