我正在尝试理解有关extern,static等的一些基础知识,并尝试了以下示例,但我不明白为什么我不能"仅仅"调用该函数,因为它(可能)内联.
我的第一个档案:F1.cpp
#include <iostream>
void Modify();
int i;
int main() {
i = 1;
std::cout << "i = " << i << std::endl;
Modify();
std::cout << "i = " << i << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第二个文件:F2.cpp
#include <iostream>
extern int i;
inline void Modify() {
i = 99;
std::cout << "i = " << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我保留inline关键字,我会得到:使用mingw在我的F1.cpp文件中对Modify()的未定义引用.但是,如果我把它取消,它一切正常..我假设C++中的inline关键字有某种行为,如static关键字?
我也看过这个主题,但是除了文档说内联函数应该总是在头文件中这一事实之外,我不明白:.cpp文件中的C++内联成员函数
谢谢你的帮助 !
根据C++标准(7.1.2函数说明符)
4 ....如果在一个翻译单元中内联宣布具有外部联系的功能,则应在其出现的所有翻译单元中内联声明; 无需诊断.
和
4内联函数应在每个使用过的翻译单元中定义,并且在每种情况下都应具有完全相同的定义
在C(第6.7.4节C标准的函数说明符)中inline,外部函数的函数说明符具有不同的语义
7 ....内联定义不提供函数的外部定义,也不禁止另一个翻译单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义
我假设
inlineC++ 中的关键字有一些像static关键字这样的行为?
相似,但不同.该名称仍然具有外部链接,并且程序的行为就像只有一个定义(例如,函数在任何地方都具有相同的地址,并且只有一个静态变量的实例).效果inline是:
您的代码违反了第二条规则,该规则可能会也可能不会导致链接错误.这就是为什么内联函数通常需要在头文件中,如果你需要在多个单元中使用它们.