initializing a static variable in header

2019-01-14 08:26发布

I am new in programming in C, so I am trying many different things to try and familiarize myself with the language.

I wrote the following:

File q7a.h:

static int err_code = 3;
void printErrCode(void);

File q7a.c:

#include <stdio.h>
#include "q7a.h"

void printErrCode(void)
{
        printf ("%d\n", err_code);
}

File q7main.c:

#include "q7a.h"

int main(void)
{
        err_code = 5;
        printErrCode();

        return 0;
}

I then ran the following in the makefile (I am using a Linux OS)

gcc –Wall –c q7a.c –o q7a.o
gcc –Wall –c q7main.c –o q7main.o
gcc q7main.o q7a.o –o q7

the output is 3.

Why is this happening?

If you initialize a static variable (in fact any variable) in the header file, so if 2 files include the same header file (in this case q7.c and q7main.c) the linker is meant to give an error for defining twice the same var?

And why isn't the value 5 inserted into the static var (after all it is static and global)?

Thanks for the help.

3条回答
Summer. ? 凉城
2楼-- · 2019-01-14 09:03

The static variables donot have external linkage which means they cannot be accessed outside the translation unit in which they are being defined. So in your case when q7.h is #include'ed in both translations units q7a.c and q7main.c ... two different copies exists in their corresponding .o files. That is why linker does not report error becuase both copies are not seen by linker while doing external symbol linkage.

查看更多
Emotional °昔
3楼-- · 2019-01-14 09:08

static means that the variable is only used within your compilation unit and will not be exposed to the linker, so if you have a static int in a header file and include it from two separate .c files, you will have two discrete copies of that int, which is most likely not at all what you want.

Instead, you might consider extern int, and choose one .c file that actually defines it (i.e. just int err_code=3).

查看更多
甜甜的少女心
4楼-- · 2019-01-14 09:16

While doing small research came to know that we can declare variable in Header file but in one of the source file includes that should have definition for that variable.

Instead if we define a variable in header file. in the source files where this header file included, definitions will be created which causes multiple definitions.

A static variable should be declared with in the file where we use it shouldn't be exposed to header file.

Hope I am giving right information. If I am wrong feel free to correct my statements in your comments.

查看更多
登录 后发表回答