When should I write the keyword 'static' before a non-member function?

后端 未结 3 933
一整个雨季
一整个雨季 2020-12-02 09:15

I\'ve recently seen a bit on SO about the static keyword before a function and I\'m wondering how to use it properly.

1) When should I

相关标签:
3条回答
  • 2020-12-02 09:54

    static, as I think you're using it, is a means of symbol hiding. Functions declared static are not given global visibility (a Unix-like nm will show these as 't' rather than 'T'). These functions cannot be called from other translation units.

    For C++, static in this sense has been replaced, more or less, by the anonymous namespace, e.g.,

    static int x = 0;
    

    is pretty equivalent to

    namespace {
      int x = 0;
    }
    

    Note that the anonymous namespace is unique for every compilation unit.

    Unlike static, the anonymous namespace also works for classes. You can say something like

    namespace {
     class Foo{};
    }
    

    and reuse that class name for unrelated classes in other translation units. I think this goes to your point 3.

    The compiler actually gives each of the symbols you define this way a unique name (I think it includes the compilation time). These symbols are never available to another translation unit and will never collide with a symbol from another translation unit.

    Note that all non-member functions declared to be inline are also by default static. That's the most common (and implicit) use of static. As to point 2, defining a static but not inline function in a header is a pretty corner case: it's not dangerous per se but it's so rarely useful it might be confusing. Such a function might or might not be emitted in every translation unit. A compiler might generate warnings if you never actually call the function in some TUs. And if that static function has within it a static variable, you get a separate variable per translation unit even with one definition in a single .h which might be confusing. There just aren't many (non-inline) use cases.

    As to point 4, I suspect those people are conflating the static member function meaning of static with that of the linkage meaning of static. Which is as good a reason as any for using the anonymous namespace for the latter.

    0 讨论(0)
  • 2020-12-02 09:59

    You should define non-member functions as static when they are only to be visible inside the code file they were declared in.

    This same question was asked on cplusplus.com

    0 讨论(0)
  • 2020-12-02 10:16

    The keyword "static" is overloaded to mean several different things:

    • It can control visibility (both C and C++)

    • It can persist a variable between subroutine invocations (both C and C++)

      ... and ...

    • It can make a method or member apply to an entire class (rather than just a class instance: C++ only)

    Short answer: it's best not to use ANY language facility unless

    a) you're pretty sure you need it

    b) you're pretty sure you know what you're doing (i.e. you know WHY you need it)

    There's absolutely nothing wrong with declaring static variables or standalone functions in a .cpp file. Declaring a static variable or standalone function in a header is probably unwise. And, if you actually need "static" for a class function or class member, then a header is arguably the BEST place to define it.

    Here's a good link:

    http://www.cprogramming.com/tutorial/statickeyword.html

    'Hope that helps

    0 讨论(0)
提交回复
热议问题