在C语言中使用宏是否可以移植?
此C语言程序定义宏START和END,用于生成运行时函数执行信息。当然,TRACE_START和TRACE_END的操作可以是任何东西,例如推送和弹出堆栈、动态评测等。此外,没有理由不能在运行时配置操作行为。这为某些类型的软件产品提供了许多有吸引力的可能性 另一方面,将函数的开始括号和结束括号从f(){}重新定义为f()START…END可能会破坏许多自动工具接受事实, 这样做意味着什么?宏处理器的这种使用是可移植的吗 下面的代码使用gcc-pedantic正确编译在C语言中使用宏是否可以移植?,c,macros,c-preprocessor,C,Macros,C Preprocessor,此C语言程序定义宏START和END,用于生成运行时函数执行信息。当然,TRACE_START和TRACE_END的操作可以是任何东西,例如推送和弹出堆栈、动态评测等。此外,没有理由不能在运行时配置操作行为。这为某些类型的软件产品提供了许多有吸引力的可能性 另一方面,将函数的开始括号和结束括号从f(){}重新定义为f()START…END可能会破坏许多自动工具接受事实, 这样做意味着什么?宏处理器的这种使用是可移植的吗 下面的代码使用gcc-pedantic正确编译 #include <s
#include <stdio.h>
#define START {TRACE_START
#define END TRACE_END}
#define TRACE_START printf("ENTERING %s\n", __func__);
#define TRACE_END printf("LEAVING %s\n", __func__);
int func()
START
printf ("Hello World %s\n");
END
int main()
START
func();
END
提前感谢您的宝贵意见。预处理器不应该关心其扩展结果的语法,编译器也不应该关心预处理器magic产生的输入。好吧,这是完全合法的,尽管很可怕。原样的代码严格符合C标准的定义,所以从这个意义上说它是可移植的。正如您所注意到的,它可能不适用于自动工具。一般来说,也不能依赖它来处理其他源代码,因为其他源代码可能对
开始
、结束
等有自己的用途。当你成为一名程序员时,你通常会学会避免这样的混乱。几乎没有理由删除{
和}
。只需将开始
和结束
宏与{
和}
一起放置,即可检测例程。请注意,没有理由期望任意函数会到达结束
,因为函数可能会返回返回
语句(或使用longjmp
或exit
或abort
等)。甚至需要非无效函数才能到达端
。它是“可移植的”从某种意义上说,每一个符合标准的编译器都必须接受它。然而,它是非常非传统的,并且,正如您所指出的,它很可能与IDE、代码分析工具、代码格式化程序以及其他试图阅读代码的人交互不好。
ENTERING main
ENTERING func
Hello World
LEAVING func
LEAVING main