C程序可以根据其值确定宏标识符/枚举名称吗?

use*_*803 3 c macros enums

假设我们将一些错误代码定义为宏 -

#define ERR_SUCCESS 0
#define ERR_BAD_INPUT 1
Run Code Online (Sandbox Code Playgroud)

...

或者作为枚举数据类型 -

enum err_t = { ERR_SUCCESS, ERR_BAD_INPUT, ...};
Run Code Online (Sandbox Code Playgroud)

其中一个id由以下函数返回 -

int foo(); /* if foo() returns 0, it means success, etc */
Run Code Online (Sandbox Code Playgroud)

调用者foo()可以确定哪个标识符/名称(ERR_SUCCESS,ERR_BAD_INPUT,...)链接到int返回值?

tas*_*oor 6

没有.

处理器宏,顾名思义,在编译步骤开始之前进行预处理时解析.在呼吁,在运行时即有像名字没有提及ERR_SUCCESS,ERR_BAD_INPUT等等,这就是为什么你不能在运行时确定的标识符名称.

Simliar推理enum也适用于enum创建编译时常量,并且您无法在运行时获取标识符名称.


Dav*_*eri 5

不是直接的,正如其他人指出的那样,这些标识符在运行时不可用,但您可以使用并行的名称列表(X 宏可以提供帮助):

#include <stdio.h>

#define ERRS \
    X(ERR_SUCCESS) \
    X(ERR_BAD_INPUT) \
    X(ERR_MORE)

#define X(x) x,
enum err_t {ERRS};
#undef X

#define X(x) #x,
static char *err_name[] = {ERRS};
#undef X

static int foo(void)
{
    /* ... */
    return ERR_BAD_INPUT;
}

int main(void)
{
    printf("%s\n", err_name[foo()]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

ERR_BAD_INPUT
Run Code Online (Sandbox Code Playgroud)