C++ 为什么在C++;在标头中定义成员函数而不是自由函数?
假设我有三个文件C++ 为什么在C++;在标头中定义成员函数而不是自由函数?,c++,C++,假设我有三个文件A.cpp,B.cpp,和B.hA.cpp和B.cpp都包括B.h。我在B.h中定义了一个自由函数(无论出于何种原因)。然后我得到一个链接器错误: ld:架构x86_64的1个重复符号 这是有道理的。编译器分别编译A.cpp和B.cpp,因此有两个具有相同名称和参数的函数 但是,如果我在B.h中声明了一个类,并在这个类中定义了一个成员函数,它就可以正常编译。为什么呢?这不应该产生相同的链接器错误吗 为什么C++在一个报头中定义一个成员函数,而不是一个自由函数? 多次定义非内联函数
A.cpp
,B.cpp
,和B.h
A.cpp
和B.cpp
都包括B.h
。我在B.h
中定义了一个自由函数(无论出于何种原因)。然后我得到一个链接器错误:
ld:架构x86_64的1个重复符号
这是有道理的。编译器分别编译A.cpp
和B.cpp
,因此有两个具有相同名称和参数的函数
但是,如果我在B.h
中声明了一个类,并在这个类中定义了一个成员函数,它就可以正常编译。为什么呢?这不应该产生相同的链接器错误吗
为什么C++在一个报头中定义一个成员函数,而不是一个自由函数?
多次定义非内联函数是不合适的。这是“一个定义规则”的一部分
可以在多个翻译单元中定义内联函数。事实上,内联函数必须在使用它们的每个翻译单元中定义
头文件通常包含在多个翻译单元中。因此,头中定义的所有函数都应该是内联函数
在类定义中定义的成员函数是隐式内联的。作为内联函数,可以在头中定义它们,就像在头中定义内联非成员函数一样。同样,在头中定义非内联成员函数也不可以,就像在头中定义非内联非成员函数一样。这是否回答了您的问题?我不是链接方面的专家,但答案可能很简单,因为成员函数是隐式
内联的
。尝试将inline
添加到您的免费函数中,然后查看。