相关疑难解决方法(0)

C++的内联是不是完全可选的?

我有一个有内联成员的类,但后来我决定从头中删除实现,所以我将函数的成员体移到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警告,但没想到链接错误.在这种情况下编译器应该做的正确/标准的事情是什么,我是否应该根据标准得到我的错误?

c++ inline

20
推荐指数
3
解决办法
2455
查看次数

为什么ld链接器允许使用相同方法的多个类定义?

考虑这个文件,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++ linker g++ ld

18
推荐指数
1
解决办法
1636
查看次数

如果我在头文件中实现一个类会怎么样?

可能重复:
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文件吗?

c++ header

5
推荐指数
2
解决办法
1941
查看次数

内联函数链接错误 C++

考虑以下代码:

在 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' 关键字,编译和运行将继续没有错误。

请告诉我为什么这个“内联”函数出现链接错误?

c++ inline-functions linkage

2
推荐指数
1
解决办法
1453
查看次数

标签 统计

c++ ×4

g++ ×1

header ×1

inline ×1

inline-functions ×1

ld ×1

linkage ×1

linker ×1