美文网首页
在C/C++头文件中定义函数时使用static关键字的那些事

在C/C++头文件中定义函数时使用static关键字的那些事

作者: crazyhank | 来源:发表于2022-02-06 11:59 被阅读0次

首先,如果在头文件中定义一个普通的函数,比如下面这样,肯定会在程序链接的时候报“重复定义”的错误。

// 错误的版本,链接时会报重复定义错误
void DoSomething()
{
}

D:/kexin/untitled5/s.h:16: multiple definition of `DoSomething()'
CMakeFiles\untitled5.dir/objects.a(1.cpp.obj):D:/kexin/untitled5/s.h:16: first defined here
collect2.exe: error: ld returned 1 exit status

那么如果我们想在头文件中定义一些常用的函数,一般做法是在函数前加“inline”关键字,这样就不会报“重复定义”的错误了,并且能够像函数一样被其他的c/cpp源码文件调用了。

// inline版本,没有问题
inline void DoSomething()
{
}

这时候如果你在inline后面加入“static”关键字也是没问题的:

// inline static版本,也是没有问题
inline static void DoSomething()
{
}

区别是:加了static关键字后,每个调用它的c/c++源码文件都会有一个copy,即static其实是限制了函数的作用域在本源码文件内。

----------------------------------- 分割线 ----------------------------------------
那么另一个问题来了:如果我们在函数内部定义static变量时,会是怎么样的情况呢?

// 版本1:非static的inline函数内部定义static变量
inline void NonStaticInlineFunc()
{
    static int localVar;
    std::cout << "In NonStaticInlineFunc: localVar = " << (void*)&localVar << std::endl;
}
// 版本2:static的inline函数内部定义static变量
inline static void StaticInlineFunc()
{
    static int localVar;
    std::cout << "In StaticInlineFunc: localVar = " << (void*)&localVar << std::endl;
}

如果我们分别在1.cpp和2.cpp两个源码文件中分别调用这两个inline函数,可以通过结果看到区别。

// 1.cpp
void foo1()
{
    std::cout << "Calling by foo1" << std::endl;
    NonStaticInlineFunc();
    StaticInlineFunc();
}
// 2.cpp
void foo2()
{
    std::cout << "Calling by foo2" << std::endl;
    NonStaticInlineFunc();
    StaticInlineFunc();
}

程序运行结果:

Calling by foo1
In NonStaticInlineFunc: localVar = 0x4040b0
In StaticInlineFunc: localVar = 0x408044
Calling by foo2
In NonStaticInlineFunc: localVar = 0x4040b0
In StaticInlineFunc: localVar = 0x408054

可以看到:如果在inline后加了static关键字,则在函数中定义的static变量则会在每一个源码调用文件中产生了一个拷贝,而没加static关键字的inline函数则会产生一个全局的static变量。

具体解释参考https://stackoverflow.com/questions/185624/static-variables-in-an-inlined-function

相关文章

  • 在C/C++头文件中定义函数时使用static关键字的那些事

    首先,如果在头文件中定义一个普通的函数,比如下面这样,肯定会在程序链接的时候报“重复定义”的错误。 D:/kexi...

  • static关键字的再思考

    引言 static关键字在c/c++中的使用是十分广泛的。该关键字的作用很多,其中一个最常用的作用就是对函数...

  • C++中容易被忽略的基础知识

    const和define的区别C++中static关键字的总结C++中的构造函数及深拷贝浅拷贝c++基础之引用和指...

  • Qt开发经验小技巧236-240

    关于在头文件中定义函数使用static关键字的血的教训。 有时候我们需要将一些常用函数写在一个文件中供很多地方调用...

  • Static关键字的作用

    在C++、C、Java等高级语言中均有关键字static C语言中 static的含义不是存储方式,而是指对函数的...

  • #import,#include,@class的区别

    #import是OC导入到文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会...

  • C++ priority_queue

    头文件#include 自定义比较函数lambda (c++11)注意使用关键字decltypeauto comp...

  • 第三章 C++中的C

    简介:提供在C++中使用C风格的背景知识 3.1 创建函数 在C++中,函数定义的参数列表中,可以使用未命名的参数...

  • C++基础

    C++ readme 避免头文件重复定义, extern C的用法: 内联函数: inline function ...

  • 第十五章:源文件与程序

    C头文件实现C++头文件方式 函数指针image.png 头文件的使用image.pngimage.pngimag...

网友评论

      本文标题:在C/C++头文件中定义函数时使用static关键字的那些事

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