将 extern 定义为宏未定义行为吗?

问题描述 投票:0回答:1

我遇到了一些代码 使用名为 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 宏,则不会发生此类错误。

是什么原因导致这种行为? 是否在某处指定?

我找不到有关此主题的任何信息

macros extern
1个回答
0
投票

宏实际上是用作文本替换,所以就像您手动键入它一样,如果这可行,那么为其定义宏应该没有问题。 按照这个逻辑,如果定义为 extern 时不起作用,但像这个宏一样起作用,则表明该宏没有将其设置为 extern,而是设置为 static。

这可能是由于不可预见的链接问题导致测试失败。

© www.soinside.com 2019 - 2024. All rights reserved.