我正在读一本关于C的书,在作者代码的某处我发现了一个函数原型的定义,然后是一个具有相同名称的宏,并且在任何.h
或.c
文件中都没有函数本身的定义.
我的意思是这样的:
int print_my_stufff(char *stuff); #define print_my_stuff(A) (printf("%s\n", A)) /* and print-my-stuff() function never defined anywhere else */
代码有效,但我不知道为什么他首先需要一个函数原型?难道他不能写一个宏吗?重点是什么?是告诉编译器应该将宏评估为返回的表达式int
还是什么?删除原型似乎不会改变行为.作者没有解释这一点.
从inline
功能开始,这是一种过时的做法.如果您按原样调用该函数print_my_stuff("hello")
,则预处理器将看到调用语法并插入宏的内容.如果您使用其他名称f_ptr = &print_my_stuff
,则编译器将使用实际函数.
调用该函数也(print_my_stuff)("hello")
将绕过宏.一些偏执风格的指南甚至需要将某些函数名称括起来,因为Macros Are Evil.