C++从另一个cpp文件调用内联函数

Jon*_*aws 2 c++ inline extern

我正在尝试理解有关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++内联成员函数

谢谢你的帮助 !

Vla*_*cow 5

根据C++标准(7.1.2函数说明符)

4 ....如果在一个翻译单元中内联宣布具有外部联系的功能,则应在其出现的所有翻译单元中内联声明; 无需诊断.

4内联函数应在每个使用过的翻译单元中定义,并且在每种情况下都应具有完全相同的定义

在C(第6.7.4节C标准的函数说明符)中inline,外部函数的函数说明符具有不同的语义

7 ....内联定义不提供函数的外部定义,也不禁止另一个翻译单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义


Mik*_*our 5

我假设inlineC++ 中的关键字有一些像static关键字这样的行为?

相似,但不同.该名称仍然具有外部链接,并且程序的行为就像只有一个定义(例如,函数在任何地方都具有相同的地址,并且只有一个静态变量的实例).效果inline是:

  • 只要所有定义都相同,就可以在多个转换单元中定义该函数.常规函数只能定义一次.
  • 必须在使用它的任何翻译单元中定义该函数.这允许编译器在不需要非内联定义时省略它.

您的代码违反了第二条规则,该规则可能会也可能不会导致链接错误.这就是为什么内联函数通常需要在头文件中,如果你需要在多个单元中使用它们.