为什么要定义函数原型,然后使用相同名称的预处理器宏?

cor*_*ump 15 c c-preprocessor

我正在读一本关于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 */
Run Code Online (Sandbox Code Playgroud)

代码有效,但我不知道为什么他首先需要一个函数原型?难道他不能写一个宏吗?重点是什么?是告诉编译器应该将宏评估为返回的表达式int还是什么?删除原型似乎不会改变行为.作者没有解释这一点.

Pot*_*ter 8

inline功能开始,这是一种过时的做法.如果您按原样调用该函数print_my_stuff("hello"),则预处理器将看到调用语法并插入宏的内容.如果您使用其他名称f_ptr = &print_my_stuff,则编译器将使用实际函数.

调用该函数也(print_my_stuff)("hello")将绕过宏.一些偏执风格的指南甚至需要将某些函数名称括起来,因为Macros Are Evil.

  • @AndréFratelli如果使用该函数但从未定义过,则会出现链接错误.如果这本书描述的是编写一个没有定义的原型,那么它的问题比不合时宜的更深. (2认同)