将非静态内联函数重新声明为extern

PSkocik

重新声明extern内部范围内的内联函数是否合法

不论MACRO是否真实,下面的代码是合法的C吗?

#if MACRO
    enum { have_macro = 1 };
    inline int foo(void){ return 43; }
#else
    enum { have_macro = 0 };
#endif
int main()
{
    if(have_macro){
        extern int foo(void);
        return foo();
    }else
        return 0;
}
extern int foo(void); //maybe instantiate
MM

非语言律师的初步说明:术语C中的外部定义不应与外部链接混淆extern外部链接混淆粗略地讲,它意味着“出现在文件范围内而不是内联定义的任何定义”。例如,静态函数定义将是外部定义。有关详细说明,请参见C17标准的6.9节。

还要注意,内联定义一词有其独特之处。与一个函数定义inline的关键字可以是一个直列确定指标或一个外部定义取决于其他事情我将在下面覆盖。


对于以下代码(由MACRO定义产生):

inline int foo(void){ return 43; }
int main()
{
    if(1){
        extern int foo(void);
        return foo();
    }else
        return 0;
}
extern int foo(void);

第一线提供了一个外部定义foo,而不是内联定义:

该规则是,如果有一个与外部链接的函数具有的定义inline关键字,并且该功能的文件范围的声明没有inline关键字,则函数定义为外部定义。几乎所有的确切示例,请参见C17 6.7.4 / 10。块范围声明没有区别。

到目前为止,此代码尚可,但是如果另一个翻译单元也为提供了外部定义,则该行为将是未定义的行为foo


对于没有MACRO的版本:

int main()
{
    if(0){
        extern int foo(void);
        return foo();
    }else
        return 0;
}
extern int foo(void);

到目前为止,这段代码还不错,但是,如果foo某个地方的程序中没有确切的函数定义,那将是未定义的行为(C17 6.9 / 5)隐藏背后的代码if(0)并没有脱离一个定义规则。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章