C:用字符串连接_计数器_

C:用字符串连接_计数器_,c,C,我想字符串化\uuuu计数器\uuuu并将其打印为字符串而不是整数,这可能吗 printf("%s\n", #__COUNTER__); 我尝试了以下方法,但不起作用 hello.c:6:19: error: stray ‘#’ in program printf("%s\n",#__COUNTER__); 是的,但它需要一个间接过程,因为不能在宏之外使用#操作符 #define STRINGIFY_2(a) #a #define STRINGIFY(a) STRINGIFY_2(a) p

我想字符串化
\uuuu计数器\uuuu
并将其打印为字符串而不是整数,这可能吗

printf("%s\n", #__COUNTER__);
我尝试了以下方法,但不起作用

hello.c:6:19: error: stray ‘#’ in program
printf("%s\n",#__COUNTER__);

是的,但它需要一个间接过程,因为不能在宏之外使用
#
操作符

#define STRINGIFY_2(a) #a
#define STRINGIFY(a) STRINGIFY_2(a)

printf("%s\n", STRINGIFY(__COUNTER__));
展开
\uuuuu COUNTER\uuuu
需要双宏,否则结果将是
“\uuuu COUNTER\uuuuu”


如果你不想重新发明轮子,那正是你要做的。

是的,但这需要一个间接的过程,因为你不能在宏之外使用
操作符

#define STRINGIFY_2(a) #a
#define STRINGIFY(a) STRINGIFY_2(a)

printf("%s\n", STRINGIFY(__COUNTER__));
展开
\uuuuu COUNTER\uuuu
需要双宏,否则结果将是
“\uuuu COUNTER\uuuuu”


如果你不想重新发明这个轮子,那正是你要做的。

你必须用一个预处理器宏对它进行字符串化

#define XSTR(s) STR(s)
#define STR(s) #s
printf("%s", XSTR(counter));

必须使用预处理器宏对其进行字符串化

#define XSTR(s) STR(s)
#define STR(s) #s
printf("%s", XSTR(counter));


计数器的定义是什么?此外,您不应使用
来使用宏,而应仅用于定义宏我不知道“作为字符串打印”意味着什么。打印时整数与字符串有什么不同?然后只需将
snprintf
%d
一起使用即可。我有一种感觉,答案中提出的宏并不是你真正需要的。最好描述一下真正的问题。好的,那么答案就是你需要的。显然,要将其与其他内容连接起来,您需要添加另一个间接级别。始终从预处理器过程的角度考虑。像预处理器一样思考:)计数器的定义是什么?此外,您不应使用
来使用宏,而应仅用于定义宏我不知道“作为字符串打印”意味着什么。打印时整数与字符串有什么不同?然后只需将
snprintf
%d
一起使用即可。我有一种感觉,答案中提出的宏并不是你真正需要的。最好描述一下真正的问题。好的,那么答案就是你需要的。显然,要将其与其他内容连接起来,您需要添加另一个间接级别。始终从预处理器过程的角度考虑。像预处理器一样思考:)如果我理解正确的话,第一个STRINGIFY(_uuu计数器uu)将导致STRINGIFY_2(0),然后会导致“0”?(不知道#仅在宏定义中有效)@Har完全正确-这个用例真的需要双宏舞蹈吗?我认为只有在将东西粘贴在一起时才需要这样做。@ChristianGibbons,出于同样的原因,这既不是
#
也不是
#
在粘贴或字符串化它们之前扩展它们的参数。哦,对了。我知道我遗漏了一些东西。因此,如果我理解正确,第一个STRINGIFY(_u;COUNTER___;)将导致STRINGIFY_2(0),这将导致“0”?(不知道#仅在宏定义中有效)@Har完全正确-这个用例真的需要双宏舞蹈吗?我认为只有在将东西粘贴在一起时才需要这样做。@ChristianGibbons,出于同样的原因,这既不是
#
也不是
#
在粘贴或字符串化它们之前扩展它们的参数。哦,对了。我知道我遗漏了什么。纠正了错误。纠正了错误。