假设我们将一些错误代码定义为宏 -
#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返回值?
没有.
处理器宏,顾名思义,在编译步骤开始之前进行预处理时解析.在呼吁,在运行时即有像名字没有提及ERR_SUCCESS,ERR_BAD_INPUT等等,这就是为什么你不能在运行时确定的标识符名称.
Simliar推理enum也适用于enum创建编译时常量,并且您无法在运行时获取标识符名称.
不是直接的,正如其他人指出的那样,这些标识符在运行时不可用,但您可以使用并行的名称列表(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)
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |