在c++中,为什么必须在类之外定义类成员函数以单独编译?



下面是单独编译的简单示例:

// mod.cpp
#include <cstdio>
class MyModule {
public:
void print_msg();
};
void MyModule::print_msg() {
printf("hello from modulen");
}
// main.cpp
class MyModule {
public:
void print_msg();
};
int main() {
MyModule a;
a.print_msg();
}

我们可以用

编译并运行它
g++ main.cpp -c -o main.o
g++ mod.cpp -c -o mod.o
g++ main.o mod.o -o main
./main

上面的工作很好,但是如果我移动MyModule::print_msg的定义在类中:

// mod.cpp
#include <cstdio>
class MyModule {
public:
void print_msg() { printf("hello from modulen"); }
};

我得到一个'未定义的引用'错误编译main:

g++ main.cpp -c -o main.o  # OK
g++ mod.cpp -c -o mod.o    # OK
g++ main.o mod.o -o main   # undefined reference error
/usr/bin/ld: main.o: in function `main':
main.cpp:(.text+0x23): undefined reference to `MyModule::print_msg()'
collect2: error: ld returned 1 exit status

我知道前者是标准的方式,类定义应该进入头文件,但我想知道为什么第二种方法不起作用。

类内部定义的函数是隐式内联的。c++要求:

内联函数[或变量(c++ 17起)]的定义必须在访问它的翻译单元中可访问。

由于您只在mod.cpp中定义了它,所以在main.cpp中没有定义,编译失败。

通常,将类的定义以及其中定义的所有函数的定义放在一个头文件中,该类的所有用户将包含该文件。在类之外定义的函数然后放在.cpp文件中。这样,类的所有用户都可以使用所有内联函数的单一一致定义,而不必在每个.cpp文件中手动重复类的定义。

最新更新