He who is Shy* 给了你answer 的胚芽,但只有胚芽。在 C 预处理器中将值转换为字符串的基本技术确实是通过 '#' 运算符,但建议解决方案的简单音译会导致编译错误:
#define TEST_FUNC test_func
#define TEST_FUNC_NAME #TEST_FUNC
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
语法错误出现在“puts()”行 - 问题是源代码中的“杂散#”。
在 C 标准的第 6.10.3.2 节“# 运算符”中,它说:
每个 # 预处理标记
类似函数的替换列表
宏后面应该跟一个参数
作为下一个预处理令牌
替换列表。
问题在于您可以将宏参数转换为字符串——但您不能转换非宏参数的随机项。
所以,要达到你想要的效果,你肯定需要做一些额外的工作。
#define FUNCTION_NAME(name) #name
#define TEST_FUNC_NAME FUNCTION_NAME(test_func)
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
我不完全清楚您打算如何使用宏,以及您打算如何完全避免重复。这个稍微复杂一点的例子可能会提供更多信息。使用与 STR_VALUE 等效的宏是获得所需结果所必需的惯用语。
#define STR_VALUE(arg) #arg
#define FUNCTION_NAME(name) STR_VALUE(name)
#define TEST_FUNC test_func
#define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC)
#include <stdio.h>
static void TEST_FUNC(void)
{
printf("In function %s\n", TEST_FUNC_NAME);
}
int main(void)
{
puts(TEST_FUNC_NAME);
TEST_FUNC();
return(0);
}
* 在第一次写这个答案时,shoosh 的名字使用了“害羞”作为名字的一部分。