Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C/C++: Static function in header file, what does it mean?

Tags:

c

function

static

I know what it means when static function is declared in source file. I am reading some code, found that static function in header files could be invoke in other files.

like image 427
Jarod Avatar asked Apr 23 '09 07:04

Jarod


People also ask

What is C static function?

A static function in C is a function that has a scope that is limited to its object file. This means that the static function is only visible in its object file. A function can be declared as static function by placing the static keyword before the function name.

Can I declare a static function in a header file?

You only use static functions if you want to limit the access to a function to the file they are declared. So you actively restrict access by declaring it static... The only requirement for implementations in the header file, is for c++ template functions and template class member functions.

What happens if static variable is declared in header file?

When defining a static variable in a header file, a new instance of the variable is created for each file including the header file. This is often surprising as people often expect to have only one instance of the variable. This leads to errors that are very difficult to track/understand.

Are C functions static by default?

In C, functions are global by default. The “static” keyword before a function name makes it static.


2 Answers

Is the function defined in the header file? So that the actual code is given directly in the function, like this:

static int addTwo(int x) {   return x + 2; } 

Then that's just a way of providing a useful function to many different C files. Each C file that includes the header will get its own definition that it can call. This of course wastes memory, and is (in my opinion) a quite ugly thing to be doing, since having executable code in a header is generally not a good idea.

Remember that #include:ing a header basically just pastes the contents of the header (and any other headers included by it) into the C file as seen by the compiler. The compiler never knows that the one particular function definition came from a header file.

UPDATE: In many cases, it's actually a good idea to do something like the above, and I realize my answer sounds very black-and-white about this which is kind of oversimplifying things a bit. For instance, code that models (or just uses) intrinsic functions can be expressed like the above, and with an explicit inline keyword even:

static inline int addTwo(int *x) {   __add_two_superquickly(x); } 

Here, the __add_two_superquickly() function is a fictional intrinsic, and since we want the entire function to basically compile down to a single instruction, we really want it to be inlined. Still, the above is cleaner than using a macro.

The advantage over just using the intrinsic directly is of course that wrapping it in another layer of abstraction makes it possible to build the code on compilers lacking that particular intrinsic, by providing an alternate implementation and picking the right one depending on which compiler is being used.

like image 77
unwind Avatar answered Sep 21 '22 14:09

unwind


It will effectively create a separate static function with the same name inside every cpp file it is included into. The same applies to global variables.

like image 20
sharptooth Avatar answered Sep 18 '22 14:09

sharptooth