从字符串c ++运行宏

时间:2014-10-08 08:39:03

标签: c++ string macros

#define COLOR 5
//definition function
int which_color(int color){
//...do smt...
}

// call
which_color(COLOR); // correct
which_color("COLOR"); // error

我解析包含字符串COLOR的XML文件。我需要将此字符串传递给which_color函数作为MACRO。您可以将宏扩展为字符串。是否可以将字符串转换为宏?

5 个答案:

答案 0 :(得分:4)

听起来你真正想做的是从文本文件中读取定义为字符串的颜色,并将它们转换为整数值。为此,您可以使用std::map,例如

typedef pair<string, int> colour_map_entry;
map<string, int> colour_map;

// create map of colour names to ints

colour_map.insert(colour_map_entry("RED", 1));
colour_map.insert(colour_map_entry("GREEN", 2));
colour_map.insert(colour_map_entry("BLUE", 3));

// test 

cout << "RED   -> " << colour_map["RED"] << endl;
cout << "GREEN -> " << colour_map["GREEN"] << endl;
cout << "BLUE  -> " << colour_map["BLUE"] << endl;

所以对于你的例子你可以写:

which_color(colour_map["RED"]);

或者如果您已将文件中的颜色作为字符串读取,colour

which_color(colour_map[colour]);

答案 1 :(得分:1)

这是不可能的。 编译器不知道您的符号COLOR,因为预处理器以COLOR的形式替换5的所有出现。

您可能拥有的一个选项是定义一个包含字符串到整数映射的映射。

答案 2 :(得分:1)

比较此代码的变换:

#define COLOR 5
#define intify(n) str(n)
#define str(n) atoi(#n) // Evil 2-level expansion + atoi


int which_color(int color){
    cout << color;
    return 2;
 }

int main()
{
    which_color(intify(COLOR));
    return 0;
}

为:

int which_color(int color){
    cout << color;
    return 2;
 }

int main()
{
    std::map<string, int> strToColor = { {"WHITE", 0},
                                         {"BLACK", 1}
                                       };

   std::string color = "WHITE";
   which_color(strToColor[color]);

    return 0;
}

为什么要使代码复杂化?我选择第二个选择。

答案 3 :(得分:0)

程序运行时宏名称不存在 - 您无法引用它。您需要做的是创建从颜色字符串到值的某种映射。

#include <cstring>
#include <stderror>
using namespace std;
int GetStringValue(const char * name)
{
    if (strcmp(name, "COLOR") == 0) return 5;
    if (strcmp(name, "WEIGHT") == 0) return 6;
    throw runtime_error("Invalid string name");
}

或使用std::mapstd::unordered_map

答案 4 :(得分:0)

正如@Don Reba所说:你做不到。

#define由预处理器评估,编译器不知道。

对于您的使用案例,您可以使用将std::hash_map映射到string的{​​{1}}:

int