Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中使用宏是否可以移植?_C_Macros_C Preprocessor - Fatal编程技术网

在C语言中使用宏是否可以移植?

在C语言中使用宏是否可以移植?,c,macros,c-preprocessor,C,Macros,C Preprocessor,此C语言程序定义宏START和END,用于生成运行时函数执行信息。当然,TRACE_START和TRACE_END的操作可以是任何东西,例如推送和弹出堆栈、动态评测等。此外,没有理由不能在运行时配置操作行为。这为某些类型的软件产品提供了许多有吸引力的可能性 另一方面,将函数的开始括号和结束括号从f(){}重新定义为f()START…END可能会破坏许多自动工具接受事实, 这样做意味着什么?宏处理器的这种使用是可移植的吗 下面的代码使用gcc-pedantic正确编译 #include <s

此C语言程序定义宏START和END,用于生成运行时函数执行信息。当然,TRACE_START和TRACE_END的操作可以是任何东西,例如推送和弹出堆栈、动态评测等。此外,没有理由不能在运行时配置操作行为。这为某些类型的软件产品提供了许多有吸引力的可能性

另一方面,将函数的开始括号和结束括号从f(){}重新定义为f()START…END可能会破坏许多自动工具接受事实, 这样做意味着什么?宏处理器的这种使用是可移植的吗

下面的代码使用gcc-pedantic正确编译

#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