【问题标题】:Is there a more succinct way to include a file based on a macro defining part of its name?是否有一种更简洁的方法来包含基于宏定义文件名的一部分的文件?
【发布时间】:2016-02-06 18:45:03
【问题描述】:

基于用户定义的数字宏PROBNO,我想包含一个文件"prob[PROBNO].hpp",并运行同名函数prob[PROBNO]()。这里的问题是我需要包含文件的引号,因为 给了我一个找不到文件的错误。我目前正在做以下事情:

#define STRINGIFY2(x)#x
#define STRINGIFY(x)STRINGIFY2(x)
#define CONCAT2(x,y)x##y
#define CONCAT(x,y)CONCAT2(x,y)
#define PROBNAME CONCAT(prob,PROBNO)
#include STRINGIFY(PROBNAME.hpp)
#include<iostream>
int main(){
    std::cout<<PROBNAME()<<'\n';
}

这可以完成工作,但看起来很乱。有什么办法可以摆脱一些指令吗?

【问题讨论】:

  • 您不需要标记连接来生成文件路径,使用连接可能会导致(不必要的)编译器错误。不使用连接将简化您的宏。有关示例和更多说明,请参阅 stackoverflow.com/a/32077478/1566221。

标签: c++ macros c-preprocessor


【解决方案1】:

使用角度而不是引号:

#define PROBNAME <prob PROBNO.h>

#include PROBNAME

【讨论】:

  • 在我的编译器上给出了“找不到文件”错误,因为它只将 用于 stdlib。
  • Angles 最终将搜索与引号相同的目录。 If 还将搜索 std 目录,但在检查之后,将检查相同的目录。你真的检查了吗?文件名的结构是否正确?
  • 当然,除非您使用的编译器不会:)
  • 我尝试手动输入包含的文件,它适用于引号,但不适用于角度。
  • 然后您可以尝试使用构建工具设置包含目录。如果不可能,那么这种方法就没有运气了。
猜你喜欢
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 2017-10-22
相关资源
最近更新 更多