我有一个有内联成员的类,但后来我决定从头中删除实现,所以我将函数的成员体移到cpp文件中.起初我刚刚在头文件中留下了内联签名(草率我),程序无法正确链接.然后我修好了标题,当然一切正常.
但是不是内联完全可选吗?
在代码中:
第一:
//Class.h
class MyClass
{
void inline foo()
{}
};
Run Code Online (Sandbox Code Playgroud)
接下来改为(不会链接):
//Class.h
class MyClass
{
void inline foo();
};
//Class.cpp
void MyClass::foo()
{}
Run Code Online (Sandbox Code Playgroud)
然后(将工作正常):
//Class.h
class MyClass
{
void foo();
};
//Class.cpp
void MyClass::foo()
{}
Run Code Online (Sandbox Code Playgroud)
我认为内联是可选的,想象我可能会因为我的邋iness警告,但没想到链接错误.在这种情况下编译器应该做的正确/标准的事情是什么,我是否应该根据标准得到我的错误?
考虑这个文件,first.cpp包含一个类定义并使用:
#include <iostream>
struct Foo
{
Foo(){ std::cout << "Foo()" << std::endl; }
~Foo(){ std::cout << "~Foo()" << std::endl; }
};
int main(){
Foo f;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和另一个,second.cpp包含冲突的类定义:
#include <iostream>
struct Foo
{
Foo();
~Foo();
};
Foo::~Foo(){ std::cout << "wrong ~Foo()" << std::endl; }
Run Code Online (Sandbox Code Playgroud)
当有两个定义了相同名称的函数时,链接器会抱怨重复的符号,但这些具有重复类方法的文件在没有错误的情况下编译.
我用这些命令编译:
$ g++ -c second.cpp -o second
$ g++ second first.cpp -o first
Run Code Online (Sandbox Code Playgroud)
将参数重新排序到第二个g++调用不会更改输出.
当first运行时,这是输出:
$ ./first
Foo()
wrong ~Foo()
Run Code Online (Sandbox Code Playgroud)
为什么链接器允许重复的类方法?如果显然允许,为什么wrong ~Foo()打印?
可能重复:
C++中的内联函数
如果我在其头文件中完全实现一个类,编译器会做什么?一个典型的例子如下:
class MyException
{
public:
explicit MyException(const char* file, int line) file(file), line(line) {};
const char* getFile() const { return file };
int getLine() const { return line };
private:
const char* const file;
const int line;
};
Run Code Online (Sandbox Code Playgroud)
我的目的是使用这样的类:throw MyException(__FILE__, __LINE__).
我将此头文件包含在每个.cpp文件中.我想编译器将按照定义的次数编译该类,并将(相同的)机器代码包含在它生成的每个目标文件中.现在,链接器会做什么?我尝试了一个更简单的例子(没有所有那些讨厌const的东西)并且编译得很好.
会发生什么,如果不是简单的类,我在头文件中实现了一个三屏长的C函数?最后一个问题,我应该将我的例子分成.h和.cpp文件吗?
考虑以下代码:
在 header.h 中
#pragma once
class someClass
{
public:
void foo();
};
Run Code Online (Sandbox Code Playgroud)
在头文件.cpp中
#include "header.h"
inline void someClass::foo(){}
Run Code Online (Sandbox Code Playgroud)
在main.cpp中
#include <iostream>
#include "header.h"
using namespace std;
int main()
{
someClass obj;
obj.foo();
}
Run Code Online (Sandbox Code Playgroud)
这里我得到一个链接错误,因为 foo 函数在 header.cpp 中被定义为内联,如果我删除 'inline' 关键字,编译和运行将继续没有错误。
请告诉我为什么这个“内联”函数出现链接错误?