提问人:rumpirate 提问时间:10/1/2023 最后编辑:Progmanrumpirate 更新时间:10/1/2023 访问量:29
使用正确的 #define 预处理器指令语法替换/重命名文本/函数名称
Using correct #define preprocessor directive syntax to replace/rename text/function names
问:
使用预处理器指令 #define 替换/重命名以下代码片段的正确语法是什么:
printf("\nrxBuffer: %s", rxBuffer);
fprintf(fpOut, "\nReceived Command: %s",rxBuffer);
自:
xil_printf("\nrxBuffer: %s", rxBuffer);
//fprintf(fpOut, "\nReceived Command: %s",rxBuffer);
不确定如何将宏名称与将进行正确替换的值分开。为了避免子字符串不匹配的可能性,我打算通过包含初始函数括号和引号来区分 printf 和 fprintf,但从语法上讲,我不太清楚如何做到这一点?
例:
#define XIL_VITIS
#ifdef XIL_VITIS
#define printf(" xil_printf("
#define fprintf //fprintf
#endif
最终,我决定简单地复制文件并实际修改代码。但是在最初对此进行了鬼混之后,我仍然很好奇正确的语法可能/会是什么?
答:
以下是适合您目的的解决方案:
#define XIL_VITIS
#ifdef XIL_VITIS
#define printf xil_printf
#define fprintf(...)
#endif
宏定义由宏名称组成,可以选择紧跟带括号的参数名称列表和替换列表,后者是 C 预处理器标记的列表。
您不能使用任意字符序列,例如用于宏定义,但如果 you 作为标识符,则每次出现 as C 标识符都将替换为该行之后。printf("
#define
printf
xil_printf
printf
xil_printf
#define
替换列表中的注释将在分析时被删除,既不是扩展的一部分,也不是作为扩展宏的文本插入,因此不会产生预期的效果:将扩展为一个逗号表达式,该表达式将编译为无代码,除非或被定义为具有具有副作用的扩展的宏。您不能完全用注释实现替换,但定义为具有参数变量列表且无扩展的宏应该达到预期的效果:禁用调用。语句将扩展为 ,这并不完全等同于注释行,但更符合程序结构。#define fprintf //fprintf
fprintf(fpOut, "\nReceived Command: %s",rxBuffer);
(fpOut, "\nReceived Command: %s",rxBuffer);
fpOut
rxbuffer
fprintf
fprintf
;
请注意,这些宏可能会影响其他代码,这些代码的副作用不是预期的,也是不希望的。
评论