头文件中定义全局变量

引言

这些天写的程序中用到了全局变量,一开始是在一个文件下做测试后来把文件按逻辑拆分了一下,不同的代码被放在了几个文件中,最后用Makefile来编译就遇到了今天的话题,怎么在头文件中定义全局变量呢?

做法

要想一个文件中的变量被一个工程中的其他多个文件同时访问就要借助extern关键字,在头文件中用extern关键字声明该全局变量可供其他外部文件使用

  1. 在头文件中声明在C文件中定义
    其他文件要用到该变量时直接在C文件中用extern声明变量就可以了不用包含头文件
//如:parser.h中声明count、g_sigstop为全局变量
#ifndef PARSER_H
#define PARSER_H

extern int                              count;                                      
extern int                              g_sigstop;

char *parser_argument(int argc, char **argv); 
void print_usage();
#endif 

切记这里头文件中是声明不是定义,如果你要作死给count或者g_sigstop赋个值,比如:

extern int                              count=0;                                      
extern int                              g_sigstop=0;

那问题就来了,只要包含这个头文件的C文件在编译的时候都会提示 count被多次定义这样的错误,因为include只是包含,会在预编译的时候把头文件的代码内容都copy到#include 头文件名了的C文件中来,所以最后包含了相应头文件的C文件都在编译时显示多次定义某个变量,在没有预编译之前头文件中负责声明,C文件中负责定义,通过预编译之后在C文件中既有变量的声明也有变量的定义,这样就可以直接使用变量了,把声明和定义放开在不同的地方这样方便了文件的移植和其它文件的引用

  1. 如果是多个C文件,只要有一个C文件定义过(初始化)该变量其他的C文件就不能再次定义了,需要调用这个变量直接在文件中声明就可以使用了
google@ubuntu1404:~/workspace/DLT$ cat dlt698_45.h
#ifndef  __DLT698_45_H 
#define  __DLT698_45_H

extern int five;//在头文件中声明
#endif /* __DLT698_45_H */
google@ubuntu1404:~/workspace/DLT$ 
google@ubuntu1404:~/workspace/DLT$ cat dlt698_45.c
#include "dlt698_45.h"
#include <stdio.h>

int five=7;//在C文件中定义
google@ubuntu1404:~/workspace/DLT$ 
google@ubuntu1404:~/workspace/DLT$ cat tes.c 
#include <stdio.h>

extern int five;//在其他C文件中使用时只需要声明
int main ()
{
        five++;
        printf("dlt698_45.h a is:%d\n",five);
        return 0;
}
google@ubuntu1404:~/workspace/DLT$
google@ubuntu1404:~/workspace/DLT$ cat makefile 
VARABLE= tes.o  dlt698_45.o 
test:$(VARABLE)
                gcc -o test $(VARABLE) -lcrypto -lssl
%.o:%.c
                gcc -c $< -o $@ 
                #$<=所有c文件 $@=所有目标文件
.PHONY:clean
clean:
                rm -rf *.o a.out test ca.* server.crt server.csr server.key demoCA
google@ubuntu1404:~/workspace/DLT$ make 
gcc -c tes.c -o tes.o 
#tes.c=所有c文件 tes.o=所有目标文件
gcc -c dlt698_45.c -o dlt698_45.o 
#dlt698_45.c=所有c文件 dlt698_45.o=所有目标文件
gcc -o test tes.o  dlt698_45.o  -lcrypto -lssl
google@ubuntu1404:~/workspace/DLT$ ./test 
dlt698_45.h a is:8

参考博文:https://blog.csdn.net/lichen18848950451/article/details/65627345


版权声明:本文为go_home_look原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。