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

标签 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. 您正在尝试将 "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

不幸的是,无法将"A" 转换为A 或将"A""B" 转换为"AB" 在 C++ 预处理器中。因此,您必须使用不带引号的标记,并在最后将结果字符串化。

关于c++ - 连接预处理器定义和字符串以创建#include 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50728230/

相关文章:

c++ - 为什么 UI 更改在 Qt 中不是即时的?

c++ - 从 C/C++ 播放声音的最简单方法

c++ - 当内存可用时,realloc() 返回 NULL

c++ - 复制对象时,带有 MSVC 2010 Debug 的 OpenMP 会生成奇怪的错误

c# - 如何在 Visual Studio 中显示特定提示

azure - 无法将类型 'System.__ComObject' 的 COM 对象强制转换为接口(interface)类型 'EnvDTE.Project'

c++ - 如何/在哪里获取 msvs 2008(32 位)编译器工具链的编译器而不安装 msvs2008

c++ - 为阻塞调用构造信号/槽包装器的正确方法是什么?

c++ - 在 C++ 中初始化数组

c++ - MFC中获取最近文件列表的方法