在整个程序中,对象或非内联函数不能具有 一个以上的定义;如果使用对象或功能,则必须 有一个定义。
这些是我要编译的文件:
A.cpp
#include <iostream>
#include "Greet.h"
int main()
{
greet();
std::cin.get();
}
B.cpp
#include "Greet.h"
Greet.h
#include <iostream>
void greet()
{
std::cout << "Hello World!" << std::endl;
}
我收到预期的链接器错误:
fatal error LNK1169: one or more multiply defined symbols found.
但是当我将greet()
函数放在一个类中时。代码可以正常编译,并提供输出Hello World!
。
A.cpp
#include <iostream>
#include "Greet.h"
int main()
{
Greet G;
G.greet();
std::cin.get();
}
B.cpp
#include "Greet.h"
Greet.h
#include <iostream>
class Greet
{
public:
void greet()
{
std::cout << "Hello World!" << std::endl;
}
};
为什么链接程序不会抱怨类Greet
的多个定义?
MSVC和g ++的行为相同。
答案 0 :(得分:6)
但是当我将
greet()
函数放在一个类中时。代码可以正常编译,并提供输出Hello World!
。
在类定义中定义成员函数时,将暗示inline
。对于非成员函数而言并非如此。
成员函数可以在其类定义中定义([dcl.fct.def]),在这种情况下,它是 inline 成员函数([dcl.fct.spec]),或者如果已经声明但未在其类定义中定义它,则可以在其类定义之外定义它。