例如,如何避免写两次"func_name"?
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME "func_name"
#endif
我想遵守Single Point of Truth条规则.
C预处理器版本:
$ cpp --version
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
例如,如何避免写两次"func_name"?
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME "func_name"
#endif
我想遵守Single Point of Truth条规则.
C预处理器版本:
$ cpp --version
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
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);
}
语法错误在"put()"行-问题是源代码中的"流浪#".
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的名字使用了"Shy"作为名字的一部分