相关疑难解决方法(0)

外部内联

我理解"内联"本身就是对编译器的建议,并且在它的结构中它可能会或可能不会内联函数,它也会产生可链接的目标代码.

我认为"静态内联"执行相同的操作(可能内联也可能不内联),但在内联时不会产生可链接的目标代码(因为没有其他模块可以链接到它).

"extern inline"在哪里适合图片?

假设我想用内联函数替换预处理器宏,并要求此函数被内联(例如,因为它使用__FILE__和__LINE__宏,这些宏应该为调用者而不是这个调用函数解析).也就是说,如果函数没有内联,我想看到编译器或链接器错误."extern inline"这样做吗?(我假设,如果没有,除了坚持使用宏之外,没有办法实现这种行为.)

C++和C之间是否存在差异?

不同编译器供应商和版本之间是否存在差异?

c c++ extern inline-functions

86
推荐指数
3
解决办法
4万
查看次数

为什么显式模板实例化不会破坏 ODR?

这个问题是在这个答案的上下文中出现的。

正如我所料,这个翻译单元不编译:

template <int Num> int getNum() { return Num; }
template int getNum<0>();
template int getNum<0>();  // error: duplicate explicit instantiation of 'getNum<0>'
int main() { getNum<0>(); return 0; }
Run Code Online (Sandbox Code Playgroud)

我理解这一点,我尝试两次进行相同的显式模板实例化。然而,事实证明,把它分成不同的单元,它编译:

// decl.h
template <int Num> int getNum() { return Num; }

// a.cc
#include <decl.h>
template int getNum<0>();

// b.cc
#include <decl.h>
template int getNum<0>();
int main() { getNum<0>(); return 0; }
Run Code Online (Sandbox Code Playgroud)

我没想到这一点。我认为具有相同参数的多个显式模板实例会破坏 ODR,但情况似乎并非如此。然而,这确实失败了:

// decl.h
template <int Num> int getNum();

// a.cc
#include "decl.h"
template …
Run Code Online (Sandbox Code Playgroud)

c++ one-definition-rule explicit-instantiation

5
推荐指数
1
解决办法
376
查看次数

模板类的方法是否暗示内联链接?

模板类的方法是否隐含了inline链接(不是在谈论内联优化),还是只是模板化的方法?

// A.h

template<typename T>
class A
{
public:
    void func1();                       //  #1
    virtual void func2();               //  #2
    template<typename T2> void func3(); //  #3
};

template<typename T>
void A<T>::func1(){}    //  #1

template<typename T>
void A<T>::func2(){}    //  #2

template<typename T>
template<typename T2>
void A<T>::func3<T2>(){}    //  #3
Run Code Online (Sandbox Code Playgroud)

以上所有案例都是inline[联系]吗?(我应该明确写inline任何一个)?

c++ templates inline linkage

4
推荐指数
1
解决办法
1157
查看次数