c - 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——提供外部定义(inline
with extern
)
案例 3——提供外部定义(与 相同extern
)
解决方案
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
正是关于外部联系,而不是内部联系。
推荐阅读
- sql - Postregsql 根据列值将检索到的一条记录转换为两条记录
- javascript - 如何将括号内的逗号分隔字符串转换为Javascript中的数组?
- angular - 组件不是已知元素
- linux - 在 Amazon linux bootstrap 上安装 Linux 服务
- javascript - eval 的替代数学替换
- kubernetes - 使用 Terraform 和节点组向 EKS 节点添加角色
- vuetify.js - Vuetify v-model 和 v-btn 点击事件
- amazon-web-services - 为 GCP 模拟类似于“sts 承担角色”的行为,以在本地环境中设置全局身份验证
- powershell - 测试连接powershell
- php - 如何在 Laravel 中将降价文本传递给降价刀片?