#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。您可以将宏扩展为字符串。是否可以将字符串转换为宏?
答案 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::map
或std::unordered_map
。
答案 4 :(得分:0)
正如@Don Reba所说:你做不到。
#define
由预处理器评估,编译器不知道。
对于您的使用案例,您可以使用将std::hash_map
映射到string
的{{1}}:
int