c-如何从包含宏名称的字符串中访问宏



在C中,如果我有

#define NUMBER_TWO 2
char* string = "NUMBER_TWO";

如何从string获取值2?

也许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("%dn", string_to_value(string));
printf("%dn", string_to_value("NUMBER_THREE"));
printf("%dn", string_to_value("NUMBER_FOUR"));
}

输出

2
3
4

#define NUMBER_TWO 2在运行时甚至不存在。

理论上,它甚至对编译器本身是未知的,已经由标记化器处理过了。

这意味着你需要自己创建一些查找。

if ( strcmp( string, "NUMBER_TWO" ) == 0 ) {
... NUMBER_TWO ...
} else {
... ??? ...
}

当然,如果必须查找许多,那么应该使用比一系列strcmp调用更好的方法。

#define NUMBER_TWO 2是预处理器的一部分。将源代码中的CCD_ 7替换为CCD_。运行时不存在NUMBER_TWO的踪迹。

您必须编写一个字符串并返回特定宏的东西。如何最好地解决这个问题取决于您对价值的处理。如果您希望通过字符串访问大量宏,一种简单的方法是将它们放入哈希中。

#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);

但此时您可以跳过宏,直接初始化哈希。

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);

最新更新