问题
I read that the extern
keyword is implicit in the context of functions, so unless you specify otherwise using the static
keyword (which if I'm not mistaken is basically a completely separate concept from the static
that variables employ—they just share a keyword), they are visible to all object files. This makes sense; having the declarations be implicitly external, while technically unnecessary when the declarations are in the same file as the definition, is useful because the programmer doesn't have to type extern
every time they want to use a function out of its defining file, which is more often the case than not. What seems odd to me is that it is implicit for the declarations and the definition.
With a variable, I don't need to include an extern
for the definition, and in fact, while I can do this without error, my compiler gives me a warning for it.
For example, I can have mylib.h
:
int var = 5;
//it isn't necessary to write this as
//extern int var = 5;
//my compiler even warns against it
and test.c
#include "mylib.h"
extern int var;
I would normally assume the implicit extern
for functions to be the same, that is, if I defined int func(int par)
in mylib.h
, there would not be an implicit extern
before it, but there would be an implicit extern
for any declaration of it (such as if I declared it for use in test.c
).
It also doesn't make much sense from the perspective of the extern
keyword being used as a way of telling the compiler to look elsewhere for the definition, when the definition would never be external of the file it is in.
I feel like I'm missing something here.
回答1:
If you use int x = 10;
in any header file, then you are entering into trouble, because if you include the same header file in any other file (.c
or .h
) that is linked with test.c
then you will get an error redefinition of variable x.
You can try that for yourself.
So always keep extern int x;
in a header file,
and define it int x = 10;
in any .c
file.
So, in this case, if you include the header file in multiple places, it is fine, because the header file only has a declaration and you can declare the same variable in multiple places without any problem.
you can try this sample program to test the error multiple definition of `global_value'
test.h
extern int global_value;
test.c
#include <stdio.h>
#include "test.h"
int global_value = 10;
int test_func()
{
printf("golbal_value = %d", global_value);
global_value = 20; // changed here, reflect in main after test_func call
}
main.c
#include <stdio.h>
#include "test.h"
int main()
{
test_func();
printf("global_value = %d\n", global_value);
return 0;
}
the above program works perfectly. to get the error bring that extern int global_value;
to test.c
and int global_value = 10;
to test.h
and compile all together gcc test.c main.c
来源:https://stackoverflow.com/questions/64781854/why-are-function-definitions-implicitly-external-in-c