如何从包含其名称的字符串访问宏

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