首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果函数在头文件中定义,则内联关键字是否有意义?

在C++中,内联关键字(inline)用于提示编译器将函数的定义插入到每个调用该函数的地方,以减少函数调用的开销。然而,当函数在头文件中定义时,内联关键字可能并不会带来预期的性能提升。

当一个头文件被多次包含在一个源文件中时,内联关键字可能会导致多个定义的问题。这是因为在C++中,内联函数必须在每个翻译单元(translation unit)中具有相同的定义。如果头文件被多次包含,每个翻译单元都会有一个内联函数的定义,这可能导致链接错误。

为了避免这种情况,通常建议将内联函数的定义放在头文件中,并在实现文件中使用inline关键字。这样,编译器会在链接时选择一个合适的内联函数定义,而不会导致链接错误。

总之,虽然在头文件中定义函数时使用内联关键字可能不会带来预期的性能提升,但将内联函数的定义放在头文件中,并在实现文件中使用inline关键字是一种更好的做法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++:04---内联函数

、或1~5条小语句) 内联函数定义建议放在头文件,但是不强制要求 总结:内联机制用于优化规模较小,流程直接,频繁调用的函数 5.显式内联、隐式内联 隐式内联:结构体或类函数结构体声明并定义...一般地,用户可以阅读函数的声明,但是看不到函数定义。尽管大多数教科书中内联函数的声明、定义体前面都加了 inline 关键字,但我认为 inline 不应该出现在函数的声明。...但是编译器是否将它真正内联则要看 Foo函数如何定义 内联函数应该在头文件定义,这一点不同于其他函数。...编译器调用点内联展开函数的代码时,必须能够找到 inline 函数定义才能将调用函数替换为函数代码,而对于头文件仅有函数声明是不够的。...头文件中加入或修改 inline 函数时,使用了该头文件的所有源文件都必须重新编译。 8. 慎用内联如果所有的函数都是内联函数,还用得着“内联”这个关键字吗?

1.3K40

【C语言】内联函数总结

为什么需要内联函数 C语言中,如果一些函数被频繁的调用,不断地用函数入栈,即函数栈,则会造成栈空间或者栈内存的大量消耗,为了解决这个问题,特别的引入了inline关键字,表示为内联函数。...内联函数注意事项 关键字inline必须与函数定义体放在一起,才能使函数成为内联函数,仅仅将inline放在函数声明前面不起作用 如下风格的函数fun成为内联函数: void fun(int x,...建议:inline函数定义放在头文件 其次,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数定义,要不然就成了非内联函数的调用了。...所以,这要求每个调用了内联函数的文件都出现了该内联函数定义。 因此,将内联函数定义放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦。...如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定。所以,最好将内联函数定义放在头文件

32810
  • CC++inline用法详解

    (一)inline函数(摘自C++ Primer的第三版) 函数声明或定义函数返回类型前加上关键字inline即把min()指定为内联。      ...如果两个定义不相同,程序将会有未定义的行为.         为保证不会发生这样的事情,建议把inline函数定义放到头文件每个调用该inline函数的文件包含该头文件。...一般地,用户可以阅读函数的声明,但是看不到函数定义。尽管大多数教科书中内联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数的声明。...如果所有的函数都是内联函数,还用得着“内联”这个关键字吗? 内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的 执行效率。...如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。 调用一个内联函数时,编译器首先检查调用是否正确 (进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样)。

    1.8K30

    C++inline函数简介

    3.inline函数使用的一般方法 函数定义时,返回类型前加上关键字inline即把函数指定为内联函数申明时可加也可不加。...如果一个inline函数会在多个源文件中被用到,那么必须把它定义头文件。...所以如果一个inline函数会在多个源文件中被用到,那么必须把它定义头文件。...(6)如何查看函数是否内联处理了? 实际VS2012预处理了一下,查看预处理后的.i文件,inline函数内联处理不是预处理阶段,而是在编译阶段。...类成员函数定义类体内,并随着类的定义放在头文件,当被不同的源文件包含,那么每个源文件都应该包含了类成员函数的实体,为何在链接的过程不会报函数的重定义错误呢?

    2.1K20

    C++打怪升级(三)- 内联函数 、auto、范围for循环

    那么C++是否选择了C语言的这种采用宏的方法呢? 显然是没有的,宏的缺点太过显眼了,C++便引入了新的方式 -** 内联函数** 来解决小函数多次调用时存在的系统开销问题。...先说结论:内联函数一般定义需要调用内联函数的源文件内,或者直接定义头文件内,包含头文件即可。 来看这个错误: 为什么? 为什么内联函数不能像普通函数那样声明和定义分离呢?...,而不知道Add函数具体定义,所以编译器没有办法main函数调用Add函数处展开。...内联函数分离和不分离的比较; 对于内联函数前面已经知道:内联函数与其主调函数同一源文件或内联函数头文件内联函数都可以正常展开。...因为不需要再去找被调内联函数在哪了,可以直接展开内联函数了。 声明和定义分离,就会找不到内联函数的地址了。

    49620

    【C++初阶】--- C++入门(下)

    不是函数;2. 分号问题;3. 括号控制优先级;4. 且预处理阶段就会被替换。 于是乎C++引出了内联函数的概念。...如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。...f@@YAXH@Z),该符号函数 _main 中被引用) 补充:如何解决头文件声明定义函数.cpp等文件重复包含问题(链接错误,重定义)?...常量定义 换用const enum 短小函数定义,换用内联函数 二、 auto关键字(C++11) 随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在: 类型难于拼写 含义不明确导致容易出错...注意: 使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。

    10310

    C++内联函数

    如何使函数内联 定义函数时,函数的最前面以关键字“inline”声明函数,即可使函数称为内联声明函数。...缺点: 因为代码的扩展,内联函数增大了可执行程序的体积。 C++内联函数的展开是编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码。...当你把内联函数放在头文件时,它将会使你的头文件信息变多,不过头文件的使用者不用在意这些。 有时候内联函数并不受到青睐,比如在嵌入式系统,嵌入式系统的存储约束可能不允许体积很大的可执行程序。...所有定义函数都默认声明为inline函数,所有我们不用显示地去声明inline。 虚函数不允许内联。 虽然说模板函数放中头文件,但它们不一定是内联的。...(不是说定义头文件函数都是内联函数)。

    60420

    【C++】C++ 入门

    函数重载 1、函数重载的概念 2、函数重载的原理 (重要) 六、内联函数 (重要) 1、内联函数的概念 2、内联函数定义及查看 3、内联函数的特性 七、auto 关键字 (C++11) 1、类型名思考...---- 二、命名空间 1、什么是命名空间 我们知道,C语言中,如果我们的程序包含某一头文件,那么我们就不能定义与其同名的全局变量,否则编译器就会报错;比如,在下面的程序,我们包含了 头文件,该头文件中含有 trelen 函数如果再用 strlen 作为变量名定义变量,就会造成重定义: #include #include size_t...---- 四、缺省参数 1、缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值;调用该函数时,如果没有指定实 参采用该形参的缺省值,否则使用指定的实参。...2、内联函数定义及查看 内联函数定义 //普通函数 int Add(int x, int y) { return x + y; } //内联函数--添加inline关键字 inline int Add

    2.5K00

    C++ 类使用规范建议

    定义构造函数执行初始化操作。 优点:排版方便,无需担心类是否初始化。...C++关键字struct和class几乎含义等同,我们为其人为添加语义,以便为定义的数据类型合理选择使用哪个关键字。...存取控制(Access Control) 将数据成员私有化,并提供相关存取函数,如定义变量foo_及取值函数foo()、赋值函数set_foo()。存取函数定义一般内联头文件。 12....不要将大型函数内联到类的定义,通常,只有那些没有特别意义的或者性能要求高的,并且是比较短小的函数才被定义内联函数。 13....首先,构造时,可以将m_pEngine置为NULL。需要使用m_pEngine的时候,判断其是否为NULL。如果是,创建一个新的CEngine对象。这就满足了我们按需创建的要求(惰性原则)。

    1.8K20

    Google C++编程风格指南(四)之类的相关规范

    定义构造函数执行初始化操作。 优点:排版方便,无需担心类是否初始化。...C++关键字struct和class几乎含义等同,我们为其人为添加语义,以便为定义的数据类型合理选择使用哪个关键字。...存取控制(Access Control) 将数据成员私有化,并提供相关存取函数,如定义变量foo_及取值函数foo()、赋值函数set_foo()。 存取函数定义一般内联头文件。 12....首先,构造时,可以将m_pEngine置为NULL。需要使用m_pEngine的时候,判断其是否为NULL。如果是,创建一个新的CEngine对象。这就满足了我们按需创建的要求(惰性原则)。...; 存取函数一般内联头文件; 声明次序:public->protected->private; 函数体尽量短小、紧凑,功能单一。

    87421

    c++基础(1)

    缺省参数 概念 是C++声明或定义函数时,为函数的参数指定一个默认值。调用该函数时,如果没有为某个参数指定实参(即没有显式地传递一个值给这个参数),函数将自动采用该参数的默认值。...如果调用时提供了实参,使用指定的实参值。...2缺省参数不能在定义和声明同时出现。 如果声明与定义位置同时出现缺省参数,恰巧两个位置提供的值不同,那编译器就无法确定到底用哪个缺省值。...实际的项目通常由多个源文件和多个头文件组成,在编译后链接前,当addB.obj调用的函数地址只addA.obj(addA.cpp定义存在,我们就会进行链接。...1是引用的实体加一,而指针是偏移一个类型大小 5指针需要显示解引用,指针只需要自己处理 6引用比指针更加安全 内联函数 概念 以inline修饰的函数叫作内联函数gcc编译器下,只有内联函数才会展开

    8910

    【C++】内联函数 ② ( 内联函数不能单独声明 | C++ 编译器编译内联函数分析 | 内联编译 | 内联函数指令直接插入到调用位置 | 内联函数没有额外调用开销 )

    一、内联函数不能单独声明 " inline " 关键字 , 必须与 函数名声 和 函数实现 , 写在一起 , 不能单独声明 ; 1、普通函数声明 我们定义一个 普通函数 如下 : int fun(int...a : b; } 可以 头文件 或 其它位置 声明 普通函数 : int fun(int a, int b) 2、内联函数声明 inline 内联函数 不能进行单独的声明 , inline 关键字只要使用了...上述声明 , Visual Studio 不会报错 , 仍然可以正常编译运行 ; 3、错误代码示例 - 内联函数声明 下面的代码 , 使用了 inline int fun(int a, int...b); 声明内联函数 , Visual Studio 2019 不会报错 , 程序能正常运行 , 但是不建议这样做 , 在其它环境和平台会报错 ; 错误代码示例 : // 导入标准 io 流头文件...C++ 编译器 编译代码时 , 如果发现 函数 前面有 " inline " 关键字 , 就会对该 函数 进行 " 内联编译 " , 上述 进行 " 内联编译 " 的函数 , 就是 " 内联函数

    23040

    我的C++奇迹之旅:内联函数和auto关键推导和指针空值

    Studio 2019 还提供了一个更直观的方式来查看内联函数的情况: 代码编辑器,将鼠标悬停在内联函数的调用处,Visual Studio 会弹出一个提示框,显示该函数是否内联展开。...常量定义 换用const enum 短小函数定义 换用内联函数 auto关键字(C++11) 早期C/C++auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它...C语言头文件(stddef.h),可以看到如下代码: #ifndef NULL//这是一个预处理指令,检查是否已经定义了 NULL 宏。...如果没有定义,执行下面的代码块。 #ifdef __cplusplus//这个预处理指令检查是否 C++ 编译环境下。如果是 C++ 编译环境,执行下面的代码块。...这是因为 C++ ,0 可以隐式转换为任何指针类型,所以将 NULL 定义为 0 是合理的 #else//如果不是 C++ 编译环境,执行这个代码块。

    16710

    【C++】C++入门

    红色标识) 三、命名空间 我们知道C语言中,变量的名字是不能够相同的,否则不会编译通过,但是全局定义变量时,我们可能会定义一个与包含头文件某个变量名字相同的已经被定义过的变量、类型或函数 使用命名空间可以避免这种情况的发生...,为函数的参数指定一个缺省值,调用函数时,如果没有实参采用该形参的缺省值,如果有实参采用实参 C语言不支持缺省参数 缺省值必须是常量或者全局变量 using namespace std; void...,如果文件A没有某函数定义,但使用了,这样编译器会找不到函数的地址,另一文件B中有,链接时,可以找到B函数地址,然后链接到一起,链接时函数名会被修饰 因为Windows下的vs修饰规则比较复杂...a; a = b; b = tmp; } (2)做返回值 引用返回使用时要注意一个问题:如果函数返回时,出了函数作用域返回对象还在,则可以使用引用返回,如果已经回收系统,必须使用传值返回 函数栈帧的那篇博客详细描述过...以关键字inline修饰的函数内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,提升程序运行的效率 2、内联函数的特性 (1)inline是一种空间换时间的做法,如果函数被当做是内联函数处理

    16411

    一、从C语言到C++(一)

    头文件 从C语言到C++的演进头文件(header files)的角色和用法也发生了一些变化。C语言中,头文件主要用于声明函数、变量、宏和类型定义等,以便在多个源文件中共享这些声明。...而在C++头文件的使用方式与C语言类似,但也有一些扩展和新的特性。 声明和定义分离: C++,通常将类的声明(即类的接口)放在头文件,而将类的成员函数的具体实现(即定义)放在源文件。...内联函数: C++支持内联函数(inline functions),这些函数通常在头文件定义,以便编译器调用点处内联展开函数体,提高执行效率。...定义命名空间 C++,你可以使用namespace关键字定义一个命名空间。...如果需要在命名空间中定义变量,可以加上static或constexpr关键字,使其变成静态变量或常量。 如果需要在命名空间中定义函数,可以加上inline关键字,使其变成内联函数

    9710

    从基础入门到学穿C++(C++语法基础篇)【超详细】【一站式速通】

    比如说我们写一般的代码时,包含了std(standard)的命名空间,那么我们就不能再把cout等等定义为变量或者函数名,但是如果不包含这个头文件,我们可以无限制的使用这些名称。...调用该函数时,如果没有指定实参采用该形参的缺省值,否则使用指定的实参。也就是说如果我们给定了参数就用我们传递的参数,如果没有给定,那么就使用默认值。...内联函数没有地址,因此内联函数不能声明和定义分离,分离会导致链接不上* C语言中的宏#define N 10用const int N = 10来替代 宏函数内联函数来替代 1.release模式下,...查看编译器生成的汇编代码是否存在call Add 2.debug模式下,需要对编译器进行设置,否则不会展开,因为debug模式下,编译器默认不会对代码进行优化,这里需要自己去设置 设置方式:配置 –...如果在同一行定义多个变量,使用auto关键字进行推导时,要注意这些变量必须是相同的类型。

    71510

    C++の函数——内联函数&函数指针

    所谓内联函数,其实本质上也是一种函数形式上的表现就是普通函数前面加上关键字"inline",然后相对于普通函数来说,它也比较短小。...如何定义内联函数 定义内联函数就要在函数的前面使用“inline”关键字。...而C++的内联函数提供了一种替代的方法,使用inline关键字,编译器用函数代码本身替换函数调用语句,然后再编译整个代码。...4、内联函数通过使用指令缓存来增加引用的局部性 5、通过将其标记为内联,您可以将函数定义放入头文件 缺点: 1、由于代码扩展,它增加了可执行文件的大小 2、c++内联在编译时解决。...这意味着如果您更改内联函数的代码,您将需要使用它重新编译所有代码,以确保它将被更新 3、当在头文件中使用时,它会使头文件变大,包含用户不关心的信息 4、如上所述,它增加了可执行文件的大小,这可能会导致内存抖动

    2.5K21

    【C++】基础:Google编码风格学习

    (注意:只有当函数只有 10 行或者更少时才将其定义内联函数) 使用标准的头文件包含顺序可增强可读性,避免隐藏依赖,顺序如下:相关头文件, C 库, C++ 库,其他库的.h,本项目内的.h。...另外,一般命名空间的最后注释出命名空间的名字。 3. 类 类是 C++ 中代码的基本单元。 构造函数可以进行各种初始化操作。 仅当只有数据成员时使用 struct,其它一概使用 class。...函数声明处的注释描述函数功能,定义处的注释描述函数实现。 函数的输入输出。 对类成员函数而言: 函数调用期间对象是否需要保持引用参数, 是否会释放这些参数。 函数是否分配了必须由调用者释放的空间。...参数是否可以为空指针。 是否存在函数使用上的性能隐患。 如果函数是可重入的, 其同步前提是什么? 通常变量名本身足以很好说明变量用途。某些情况下,也需要额外的注释说明。 8....倾向于不在圆括号内使用空格,关键字 if 和 else 另起一行。 switch 语句可以使用大括号分段,以表明 cases 之间不是连在一起的。单语句循环里,括号可用可不用。

    8710

    C++初阶-入门基础语法

    定义的Add函数时: 编译后链接前,a.o的目标文件没有Add的函数地址,因为Add是b.cpp定义的,所以Add的地址b.o 链接器看到a.o调用Add,但是没有Add的地址,就会到b.o...) 示图:非法访问的空间被覆盖 总结: 如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,必须使用传值返回 示例:正确使用 int& Count...b) { return a + b; } int main() { int ret=0; ret=Add(1, 2); return 0; } 注:如果在上述函数前增加inline关键字将其改成内联函数...常量定义 换用const 函数定义 换用内联函数 八、auto关键字 ---- 简介: 早期C/C++auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量(没什么用) C++11赋予...,必须对其进行强转(void *)0 注意: 使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的 C++11,sizeof(nullptr)

    70220

    C语言编程规范 clean code

    例外:如果在 C++ 编译环境,想引用纯C的头文件,这些C头文件并没有 extern "C" 修饰。非侵入式的做法是, extern "C" 中去包含C头文件。...函数的参数个数不要超过5个,如果超过可以考虑: 看能否拆分函数 看能否将相关参数合在一起,定义结构体 内联函数 内联函数是C99引入的一种函数优化手段。...建议5.7 内联函数不超过10行(非空非注释) 将函数定义内联一般希望提升性能,但是实际并不一定能提升性能。如果函数体短小,函数内联可以有效的缩减目标代码的大小,并提升函数执行效率。...规则5.3 被多个源文件调用的内联函数要放在头文件定义 内联函数是在编译时内联展开,因此要求内联函数定义必须在调用此函数的每个源文件内可见。...,需要将内联函数定义放在头文件

    5.5K10
    领券