美文网首页程序员
C++中的inline使用误区

C++中的inline使用误区

作者: 而立不惑之年 | 来源:发表于2018-04-21 08:11 被阅读32次

缘由

老代码出现新问题,链接时出现问题。

/tmp/ccODJt0B.o: In function `main':
b.cpp:(.text+0x15): undefined reference to `A::GetAttr(int)'
collect2: error: ld returned 1 exit status

复现

简化代码复现如下:

//a.h
struct A
{
public:
int GetAttr(int i);
};

//a.cpp
#include "a.h"
inline int A:: GetAttr(int i)
{
        return 0;
}
//b.cpp
#include "a.h"
int main()
{
 A a;
 a.GetAttr(0);
 return 0;
}
//gcc  -o a.o -c a.cpp
//gcc  -o b  b.cpp a.o

分开实现实现,为了提高性能,直接加inline措施不正确。如果函数长期没有使用,不会报错,遇到使用时会出现上述的链接错误。
以下两种方式都不正确:

  • 情况1: a.h加inline, a.cpp也加inline: b.cpp看到的GetAttr声明为inline,所以要求GetAttr必须定义在b.o内,即违反了cpp手册中如下要求:
    The definition of an inline function or variable (since C++17) must be present in the translation unit where it is accessed (not necessarily before the point of access).
  • 情况2: a.cpp加inline, .h不加, b.cpp看到的GetAttr声明非inline,但是a.cpp里实现的GetAttr实际为inline,因此违反了cpp手册里如下要求:
    An inline function or variable (since C++17) with external linkage (e.g. not declared static) has the following additional properties:
    It must be declared inline in every translation unit.
    即a.cpp里的GetAttr实际是inline function, 且不是static,所以必须在每个.o的视角中都是声明为inline,但是实际上b.cpp看到的是声明为非inline的

小结

inline 必须实现在头文件,对引用可见。

相关文章

  • C++中的inline使用误区

    缘由 老代码出现新问题,链接时出现问题。 复现 简化代码复现如下: 分开实现实现,为了提高性能,直接加inline...

  • 2018-03-07

    关于c++的inline关键字,以下说法正确的是() 正确答案: D 你的答案: A(错误) A使用inline关...

  • Kotlin内联函数使用

    inline 本质 Kotlin中的内联函数使用inline关键字修饰,形如: 编译时,inline会将内联函数中...

  • C++ 中的 inline 用法

    1、引入 inline 关键字的原因 在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问...

  • C++ 中 inline 的用法

    1. 引入 inline 关键字的原因 在 C/C++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的...

  • Function Macros

    Avoid function macros. In C++,inline functions render fun...

  • 【基本知识】C++中的inline函数

    C++中的inline函数,是一个内联函数,这篇文章从以下几个角度来说明这个函数。本文中所使用的解释,适合有一定C...

  • C++中的内联函数(inline)

    一、概述 在函数头部加上修饰符 “inline”,则表示此函数为内联函数。此类函数一般在头文件定义实现。 二、作用...

  • c++   inline

    在C中,编译器使用宏定义节省编译时间。在C++中使用内联函数来实现同样的效果。在程序编译时,编译器会将内联函数调用...

  • 第一周(Geek Band)

    C++实现数据和函数的封装 C++面向对象(ObjectOriented) 基本格式 Inline内联函数关键字 ...

网友评论

    本文标题:C++中的inline使用误区

    本文链接:https://www.haomeiwen.com/subject/rbkzkftx.html