Static function declared but not defined in C++

C++Static Methods

C++ Problem Overview


I'm getting an error from the following code using C++.

Main.cpp

#include "file.h"

int main()
{
   int k = GetInteger();
   return 0;
}

File.h

static int GetInteger();

File.cpp

#include "file.h"

static int GetInteger()
{
   return 1;
}

The error I get:

Error C2129: static function 'int GetInteger(void)' declared but not defined.

I've read the famous article "Organizing Code File in C and C++", but don't understand what is wrong with this code.

C++ Solutions


Solution 1 - C++

In C++, static at global/namespace scope means the function/variable is only used in the translation unit where it is defined, not in other translation units.

Here you are trying to use a static function from a different translation unit (Main.cpp) than the one in which it is defined (File.cpp).

Remove the static and it should work fine.

Solution 2 - C++

Change

static int GetInteger();

to

int GetInteger();

static in this case gives the method internal linkeage, meaning that you can only use it in the translation unit where you define it.

You define it in File.cpp and try to use it in main.cpp, but main doesn't have a definition for it, since you declared it static.

Solution 3 - C++

Because in this case, static means that the name of the function has internal linkage; that GetInteger in one translation unit is unrelated to GetInteger in any other translation unit. The keyword static is overloaded: in some cases, it affects lifetime, and in others, binding. It's particularly confusing here, because "static" is also the name of a lifetime. Functions, and data declared at namespace scope, always have static lifetime; when static appears in their declaration, it causes internal binding, instead of external.

Solution 4 - C++

functions declared as static arelocal to the containing file. Therefore, you have to define the function in the same file as the ones who call it. If you want to make it callable from other file, you must NOT declare it as static.

Solution 5 - C++

If everything is in the same translation unit it should work. You probably did not compile File.cpp into the same unit as Main.cpp.

g++ -Wall File.cpp Main.cpp

If each file is compiled separately the function must be made extern to be used from a different translation unit.

extern int GetInteger();

which is the same as

int GetInteger();

Solution 6 - C++

From my understanding, static functions are name mangled with the filename in which they are defined so when you include file.h in main.cpp, GetInteger() get mangled with main.cpp though you have defined GetInteger() in file.cpp but since it is static it gets mangled too and linker cannot find the definition of GetInteger() as no function by this name exists.

I believe lesson learnt is don't declare static functions in headerfile as are not intended to be a part of interface.

Solution 7 - C++

Consider using namespaces...

for logical sections of code that don't require internal member variables. Meaning, your GetInteger() function doesn't require an internal constant variable to be referenced. In order to keep your functions organized in your code, consider using namespaces. This keeps function names from conflicting (which will save your hours of headache with possible LNK errors). The code still works in the way you've set up and still works within the confines of the accepted answer. Additionally, your namespace name can help you quickly debug.

Main.cpp

#include "file.h"

int main()
{
   int k = HELPERS::GetInteger();
   return 0;
}

File.h

namespace HELPERS
{
    int GetInteger();
}

File.cpp

#include "file.h"

int HELPERS::GetInteger()
{
   return 1;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSaitView Question on Stackoverflow
Solution 1 - C++HighCommander4View Answer on Stackoverflow
Solution 2 - C++Luchian GrigoreView Answer on Stackoverflow
Solution 3 - C++James KanzeView Answer on Stackoverflow
Solution 4 - C++LeleDumboView Answer on Stackoverflow
Solution 5 - C++log0View Answer on Stackoverflow
Solution 6 - C++HBY4PIView Answer on Stackoverflow
Solution 7 - C++AndrewView Answer on Stackoverflow