Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the difference between declaring a function static and not including it in a header? [duplicate]

What's the difference between the following scenarios?

// some_file.c
#include "some_file.h" // doesn't declare some_func

int some_func(int i) {
    return i * 5;
}
// ...

and

// some_file.c
#include "some_file.h" // doesn't declare some_func

static int some_func(int i) {
    return i * 5;
}
// ...

If all static does to functions is restrict their accessibility to their file, then don't both scenarios mean some_func(int i) can only be accessed from some_file.c since in neither scenario is some_func(int i) put in a header file?

like image 860
atirit Avatar asked Oct 23 '25 19:10

atirit


1 Answers

A static function is "local" to the .c file where it is declared in. So you can have another function (static or nor) in another .c file without having a name collision.

If you have a non static function in a .c file that is not declared in any header file, you cannot call this function from another .c file, but you also cannot have another function with the same name in another .c file because this would cause a name collision.

Conclusion: all purely local functions (functions that are only used inside a .c function such as local helper functions) should be declared static in order to prevent the pollution of the name space.

Example of correct usage:

file1.c

static void LocalHelper()
{
}
...

file2.c

static void LocalHelper()
{
}
...

Example of semi correct usage

file1.c

static LocalHelper()   // function is local to file1.c
{
}
...

file2.c

void LocalHelper()     // global functio
{
}
...

file3.c

void Foo()
{
   LocalHelper();    // will call LocalHelper from file2.c
}
...

In this case the program will link correctly, even if LocalHelpershould have been static in file2.c

Example of incorrect usage

file1.c

LocalHelper()          // global function
{
}
...

file2.c

void LocalHelper()     // global function
{
}
...

file3.c

void Foo()
{
   LocalHelper();       // which LocalHelper should be called?
}
...

In this last case we hava a nema collition and the program wil not even link.

like image 100
Jabberwocky Avatar answered Oct 26 '25 09:10

Jabberwocky



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!