如何从包含其名称的字符串访问宏
How to access a macro from a string containing its name
在 C 中,如果我有
#define NUMBER_TWO 2
char* string = "NUMBER_TWO";
如何从 string
得到值 2?
#define NUMBER_TWO 2
是 pre-processor 的一部分。 NUMBER_TWO
在源码中被替换为2
,然后编译。运行时不存在 NUMBER_TWO
的踪迹。
你必须编写一些带有字符串和 returns 特定宏的东西。如何最好地解决这个问题取决于您对价值所做的事情。如果您有很多希望通过字符串访问的宏,一种简单的方法是将它们放入散列中。
#define NUMBER_TWO 2
char* string = "NUMBER_TWO";
// This is just an example. You'll have to write a hash,
// or better use a library such as GLib.
IntHash *stuff = int_hash_new();
int_hash_insert(stuff, "NUMBER_TWO", NUMBER_TWO);
int num = int_hash_fetch(stuff, string);
不过此时可以跳过宏,直接初始化hash。
char* string = "NUMBER_TWO";
IntHash *stuff = hash_new();
int_hash_insert(stuff, "NUMBER_TWO", 2);
int_hash_insert(stuff, "NUMBER_THREE", 3);
int_hash_insert(stuff, "NUMBER_FOUR", 4);
int num = int_hash_fetch(stuff, string);
#define NUMBER_TWO 2
在运行时甚至不存在。
从理论上讲,它甚至不为编译器本身所知,已由分词器处理。
这意味着您需要自己创建某种查找。
if ( strcmp( string, "NUMBER_TWO" ) == 0 ) {
... NUMBER_TWO ...
} else {
... ??? ...
}
当然,如果您必须查找很多,应该使用比一系列 strcmp
调用更好的方法。
也许 OP 很有趣是不是有些宏代码滥用?
使用#macro_parameter
组成字符串 "macro_argument"
.
#include <stdio.h>
#define NUMBER_TWO 2
#define NUMBER_THREE 3
#define NUMBER_FOUR 4
#define TEST_AND_RETURN(s, m) \
do { if (strcmp((s), #m) == 0) return (m); } while (0)
int string_to_value(const char *s) {
TEST_AND_RETURN(s, NUMBER_TWO); // Only 1 coding of NUMBER_TWO
TEST_AND_RETURN(s, NUMBER_THREE);
// Maybe the clear way instead, or are 2 NUMBER_FOUR a concern?
if (strcmp(s, "NUMBER_FOUR") == 0) return NUMBER_FOUR;
return -1;
}
int main() {
char* string = "NUMBER_TWO";
printf("%d\n", string_to_value(string));
printf("%d\n", string_to_value("NUMBER_THREE"));
printf("%d\n", string_to_value("NUMBER_FOUR"));
}
输出
2
3
4
在 C 中,如果我有
#define NUMBER_TWO 2
char* string = "NUMBER_TWO";
如何从 string
得到值 2?
#define NUMBER_TWO 2
是 pre-processor 的一部分。 NUMBER_TWO
在源码中被替换为2
,然后编译。运行时不存在 NUMBER_TWO
的踪迹。
你必须编写一些带有字符串和 returns 特定宏的东西。如何最好地解决这个问题取决于您对价值所做的事情。如果您有很多希望通过字符串访问的宏,一种简单的方法是将它们放入散列中。
#define NUMBER_TWO 2
char* string = "NUMBER_TWO";
// This is just an example. You'll have to write a hash,
// or better use a library such as GLib.
IntHash *stuff = int_hash_new();
int_hash_insert(stuff, "NUMBER_TWO", NUMBER_TWO);
int num = int_hash_fetch(stuff, string);
不过此时可以跳过宏,直接初始化hash。
char* string = "NUMBER_TWO";
IntHash *stuff = hash_new();
int_hash_insert(stuff, "NUMBER_TWO", 2);
int_hash_insert(stuff, "NUMBER_THREE", 3);
int_hash_insert(stuff, "NUMBER_FOUR", 4);
int num = int_hash_fetch(stuff, string);
#define NUMBER_TWO 2
在运行时甚至不存在。
从理论上讲,它甚至不为编译器本身所知,已由分词器处理。
这意味着您需要自己创建某种查找。
if ( strcmp( string, "NUMBER_TWO" ) == 0 ) {
... NUMBER_TWO ...
} else {
... ??? ...
}
当然,如果您必须查找很多,应该使用比一系列 strcmp
调用更好的方法。
也许 OP 很有趣是不是有些宏代码滥用?
使用#macro_parameter
组成字符串 "macro_argument"
.
#include <stdio.h>
#define NUMBER_TWO 2
#define NUMBER_THREE 3
#define NUMBER_FOUR 4
#define TEST_AND_RETURN(s, m) \
do { if (strcmp((s), #m) == 0) return (m); } while (0)
int string_to_value(const char *s) {
TEST_AND_RETURN(s, NUMBER_TWO); // Only 1 coding of NUMBER_TWO
TEST_AND_RETURN(s, NUMBER_THREE);
// Maybe the clear way instead, or are 2 NUMBER_FOUR a concern?
if (strcmp(s, "NUMBER_FOUR") == 0) return NUMBER_FOUR;
return -1;
}
int main() {
char* string = "NUMBER_TWO";
printf("%d\n", string_to_value(string));
printf("%d\n", string_to_value("NUMBER_THREE"));
printf("%d\n", string_to_value("NUMBER_FOUR"));
}
输出
2
3
4