如何从C宏的值制作一个char字符串?

例如,如何避免两次写入“ func_name”?


#ifndef TEST_FUN

#  define TEST_FUN func_name

#  define TEST_FUN_NAME "func_name"

#endif

我想遵循“ 单点真理”规则。


C预处理程序的版本:


$ cpp --version

cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)


Cats萌萌
浏览 549回答 3
3回答

胡子哥哥

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

饮歌长啸

一个完整的工作示例:/** compile-time dispatch&nbsp;&nbsp; &nbsp;$ gcc -Wall -DTEST_FUN=another_func macro_sub.c -o macro_sub && ./macro_sub*/#include <stdio.h>#define QUOTE(name) #name#define STR(macro) QUOTE(macro)#ifndef TEST_FUN#&nbsp; define TEST_FUN some_func#endif#define TEST_FUN_NAME STR(TEST_FUN)void some_func(void){&nbsp; printf("some_func() called\n");}void another_func(void){&nbsp; printf("do something else\n");}int main(void){&nbsp; TEST_FUN();&nbsp; printf("TEST_FUN_NAME=%s\n", TEST_FUN_NAME);&nbsp; return 0;}例:$ gcc -Wall -DTEST_FUN=another_func macro_sub.c -o macro_sub && ./macro_subdo something elseTEST_FUN_NAME=another_func

侃侃无极

#include <stdio.h>#define QUOTEME(x) #x#ifndef TEST_FUN#&nbsp; define TEST_FUN func_name#&nbsp; define TEST_FUN_NAME QUOTEME(TEST_FUN)#endifint main(void){&nbsp; &nbsp; puts(TEST_FUN_NAME);&nbsp; &nbsp; return 0;}参考:Wikipedia的C预处理程序页面
打开App,查看更多内容
随时随地看视频慕课网APP