首页 > 解决方案 > extern 对内联函数声明是否重要?

问题描述

如标准中规定

如果函数标识符的声明没有存储类说明符,则它的链接将完全确定,就好像它是使用存储类说明符声明的一样extern

但是函数说明符部分给出的inline函数语义如下:

任何具有内部链接的函数都可以是内联函数。对于具有外部链接的函数,适用以下限制: 如果函数使用内联函数说明符声明,则它也应在同一翻译单元中定义。如果翻译单元中函数的所有文件范围声明都包含内联函数说明符而没有extern,则该翻译单元中的定义是内联定义。

情况1。

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

inline void test(void); //does it provide an external definition?

案例 2。

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

extern inline void test(void); //does it provide an external definition?

案例 3。

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

void test(void); //does it provide an external definition?

我对这三种情况感到困惑。它们之间有区别吗?我目前认为它们是

案例 1——没有提供外部定义(inline没有extern

案例2——提供外部定义(inlinewith extern

案例 3——提供外部定义(与 相同extern

标签: clanguage-lawyerlinkageinline-functions

解决方案


static并且extern不能一起去。

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

inline void test(void); //does it provide an external definition?

实际上应该是

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

static inline void test(void); //does it provide an external definition?

因为定义和声明应该匹配。我不确定虽然static在使用inline.


案例 2——提供外部定义(与 extern 内联)

案例 3 -- 提供外部定义(与 extern 相同)

这些实际上与(如果我理解正确的话)冲突:

任何具有内部链接的函数都可以是内联函数。

extern正是关于外部联系,而不是内部联系。


推荐阅读