用于创建文件名的预处理程序指令

Ter*_*nal 2 c c++ c-preprocessor

我必须逐个打开文件才能用C/C++阅读.文件的名称是in0,in1,in2,in3 .....我试图使用预处理器指令来创建文件名.我想要类似的东西.

for(int i=0;i<n;i++)
{
    string inp_file="/path/"+"in"+APPEND(i);  //to generate /path/in1 etc
    open(inp_file);
}
Run Code Online (Sandbox Code Playgroud)

其中APPEND是MACRO.以来

#define APP(i) i
Run Code Online (Sandbox Code Playgroud)

可以生成价值

#define APP(i) #i
Run Code Online (Sandbox Code Playgroud)

可以将令牌转换为字符串.
我试图在很多方面将它们结合起来但却失败了.如何获得所需的结果,或者甚至可以用宏获得这样的结果?

小智 10

在您的情况下,变量i不是编译时常量,因此不可能使用预处理器或模板特化,因为在编译时根本不知道该值.你可以做的是将整数转换为字符串 - boost.lexical_cast是最容易使用的解决方案之一:

for (int i = 0; i < n; ++i) {
    // Generate /path/in1 etc
    std::string inp_file = "/path/in"+ boost::lexical_cast<std::string>(i);
    open(inp_file);
}
Run Code Online (Sandbox Code Playgroud)

如果你碰巧有一个支持C++ 11的编译器,你可以使用std::to_string().例如:

for (int i = 0; i < n; ++i) {
    // Generate /path/in1 etc
    std::string inp_file = "/path/in" + std::to_string(i);
    open(inp_file);
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.祝好运!


Daw*_*son 7

Vlad回答的附录 - 如果由于某种原因你不能/不愿意使用Boost,你可以使用标准C++来完成你想要的任务stringstream:

#include <sstream>

void Foo() {
    for (int i = 0; i < n; ++i) {
        std::stringstream converter;
        converter << "/path/in" << i;
        open(converter.str());
    }
}
Run Code Online (Sandbox Code Playgroud)