我遇到了一些代码 使用名为 SMTP_LINKAGE 的宏定义一些函数,该宏扩展为 extern。
感兴趣的片段
#ifdef SMTP_TEST
# define SMTP_LINKAGE extern
# include "../test/seams.h"
#else
# define SMTP_LINKAGE static #endif
SMTP_LINKAGE enum str_getdelim_retcode
smtp_str_getdelimfd(struct str_getdelimfd *const gdf){
..
}
smtp_str_getdelimfd 函数的原型在另一个文件中定义为
int
smtp_str_getdelimfd(struct str_getdelimfd *const gdf);
注意返回值为int
如果删除宏并直接使用 extern 关键字,编译器会抱怨定义不匹配。
但是,如果如图所示使用 SMTP_LINKAGE 宏,则不会发生此类错误。
是什么原因导致这种行为? 是否在某处指定?
我找不到有关此主题的任何信息
宏实际上是用作文本替换,所以就像您手动键入它一样,如果这可行,那么为其定义宏应该没有问题。 按照这个逻辑,如果定义为 extern 时不起作用,但像这个宏一样起作用,则表明该宏没有将其设置为 extern,而是设置为 static。
这可能是由于不可预见的链接问题导致测试失败。