Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印与带变量的整数关联的宏标识符的名称_C - Fatal编程技术网

C 打印与带变量的整数关联的宏标识符的名称

C 打印与带变量的整数关联的宏标识符的名称,c,C,我找不到类似的东西 #define ONE 1 #define TWO 2 int main() { int x = ONE; printf("%s \n", x); } //the desirable output will be "ONE" 现在,我看到了其他答案 #define PRINT(X) printf("%s \n", #x); 我没有找到如何使用它来获得我想要的东西。没有直接的方法来做到这一点。printf调用中唯一的信息是变量x,它的当前值恰好是1(在运行时)

我找不到类似的东西

#define ONE 1
#define TWO 2

int main()
{
   int x = ONE;
   printf("%s \n", x);
}
//the desirable output will be "ONE"
现在,我看到了其他答案

#define PRINT(X) printf("%s \n", #x);

我没有找到如何使用它来获得我想要的东西。

没有直接的方法来做到这一点。
printf
调用中唯一的信息是变量
x
,它的当前值恰好是
1
(在运行时),它恰好是名为
ONE
的宏的展开。编译器无法从该信息中找出名称
ONE
。可能有几个不同的宏具有相同的定义,也可能没有

如果要打印字符串
ONE
给定整数值
1
,则必须设置某种查找表或函数。例如:

const char *const names[] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", /* etc. */ };
printf("%s\n", names[x]);

将完全由您来确定名称的正确性,因此,例如,
1
不会映射到
“三”

没有直接的方法。
printf
调用中唯一的信息是变量
x
,它的当前值恰好是
1
(在运行时),它恰好是名为
ONE
的宏的展开。编译器无法从该信息中找出名称
ONE
。可能有几个不同的宏具有相同的定义,也可能没有

如果要打印字符串
ONE
给定整数值
1
,则必须设置某种查找表或函数。例如:

const char *const names[] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", /* etc. */ };
printf("%s\n", names[x]);

正确的名字完全取决于你,例如,
1
不会映射到
“三个”

,正如@KeithThompson所说,没有简单的方法

但有一种方法或多或少满足了你的要求

#define MY_ENUM_LIST \
    X( ONE   , 1 ) \
    X( TWO   , 2 ) \
    X( THREE , 3 )

#define X(name, value) name = value,
enum MyEnum {MY_ENUM_LIST};
#undef X

const char *my_enum_to_str(enum MyEnum e)
{
    switch (e)
    {
        #define X(name, value) case value: return #name;
        MY_ENUM_LIST
        #undef X
      default:
        return "<invalid>";
    }
}

int main()
{
    int x = ONE;
    printf("%d\n", x); // prints "1"
    printf("%s\n", my_enum_to_str(x)); // prints "ONE"

    return 0;
}
#定义我的枚举列表\
X(一,1)\
X(二,二)\
X(三,三)
#定义X(名称、值)名称=值,
enum MyEnum{MY_enum_LIST};
#未定义X
const char*my_enum_to_str(enum MyEnum e)
{
开关(e)
{
#定义X(名称、值)大小写值:返回#名称;
我的枚举列表
#未定义X
违约:
返回“”;
}
}
int main()
{
int x=一;
printf(“%d\n”,x);//打印“1”
printf(“%s\n”,my_enum_to_str(x));//打印“一”
返回0;
}
与原始的查找表相比,它有以下优点:

  • 无需重复枚举器名称两次
  • 您可以有任何枚举数值,而不仅仅是一个连续的范围
  • 不能意外地为枚举数指定错误的名称

正如@KeithThompson所说,没有简单的方法

但有一种方法或多或少满足了你的要求

#define MY_ENUM_LIST \
    X( ONE   , 1 ) \
    X( TWO   , 2 ) \
    X( THREE , 3 )

#define X(name, value) name = value,
enum MyEnum {MY_ENUM_LIST};
#undef X

const char *my_enum_to_str(enum MyEnum e)
{
    switch (e)
    {
        #define X(name, value) case value: return #name;
        MY_ENUM_LIST
        #undef X
      default:
        return "<invalid>";
    }
}

int main()
{
    int x = ONE;
    printf("%d\n", x); // prints "1"
    printf("%s\n", my_enum_to_str(x)); // prints "ONE"

    return 0;
}
#定义我的枚举列表\
X(一,1)\
X(二,二)\
X(三,三)
#定义X(名称、值)名称=值,
enum MyEnum{MY_enum_LIST};
#未定义X
const char*my_enum_to_str(enum MyEnum e)
{
开关(e)
{
#定义X(名称、值)大小写值:返回#名称;
我的枚举列表
#未定义X
违约:
返回“”;
}
}
int main()
{
int x=一;
printf(“%d\n”,x);//打印“1”
printf(“%s\n”,my_enum_to_str(x));//打印“一”
返回0;
}
与原始的查找表相比,它有以下优点:

  • 无需重复枚举器名称两次
  • 您可以有任何枚举数值,而不仅仅是一个连续的范围
  • 不能意外地为枚举数指定错误的名称


您不是将一定义为1吗?所以你可以说x=1;这和你现在正在做的是一样的?你想完成什么?阅读
printf
的文档怎么样?如果这没有帮助,也许你错过了一些基本的语言。上面的代码调用了未定义的行为,iow:这是无效的C。
//例外的输出将是“一”
您确定吗?你试过了吗?你想要
intx=ONE+ONE?@Nati.E:正如我所想:你错过了C语言和编程的基本知识。宏
ONE
int
变量之间没有连接。无意冒犯。但是请买一本关于编程的书,一般来说是C语言的,你不是把一定义为1吗?所以你可以说x=1;这和你现在正在做的是一样的?你想完成什么?阅读
printf
的文档怎么样?如果这没有帮助,也许你错过了一些基本的语言。上面的代码调用了未定义的行为,iow:这是无效的C。
//例外的输出将是“一”
您确定吗?你试过了吗?你想要
intx=ONE+ONE?@Nati.E:正如我所想:你错过了C语言和编程的基本知识。宏
ONE
int
变量之间没有连接。无意冒犯。但是请买一本关于一般编程和C语言编程的书。谢谢,很好的解决方案!!但这让我工作很努力。@HolyBlackCat的答案对我来说更好。非常感谢。我也会将数组
设置为const
。谢谢,非常好的解决方案!!但这让我工作很努力。@HolyBlackCat的答案对我来说更好。非常感谢。我也会将数组
设置为常量
。这是一种糟糕的方法。@Olaf请详细说明。说“糟糕的方法”根本没有建设性。好吧,这是目前最好的解决方案。唯一的替代方法是简单的查找表(需要重复枚举数名称,通常会导致错误)和在运行时按名称查找枚举数值,这显然很慢。这种方法唯一的缺点是语法非常奇特。@HolyBlackCat:调试和维护是两个方面。@Olaf我的观点是,任何其他解决方案(除了代码生成之外,这将很好地工作)都需要一个