栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

头文件不宜定义变量的原因全面解析

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

头文件不宜定义变量的原因全面解析

test-1.0使用#ifndef只是防止了头文件被重复包含(其实本例中只有一个头件,不会存在重复包含的问题),但是无法防止变量被重复定义。
复制代码 代码如下:
# vi test.c
-------------------------------
#include
#include "test.h"

extern i;
extern void test1();
extern void test2();

int main()
{
   test1();
   printf("okn");
   test2();
   printf("%dn",i);
   return 0;
}


# vi test.h
-------------------------------
#ifndef _TEST_H_
#define _TEST_H_

char add1[] = "www.shellbox.cnn";
char add2[] = "www.scriptbox.cnn";
int i = 10;
void test1();
void test2();

#endif

# vi test1.c
-------------------------------
#include
#include "test.h"

extern char add1[];

void test1()
{
   printf(add1);
}

# vi test2.c
-------------------------------
#include
#include "test.h"

extern char add2[];
extern i;

void test2()
{
   printf(add2);
   for (; i > 0; i--)
       printf("%d-", i);
}

复制代码 代码如下:
# Makefile
-------------------------------
test:    test.o test1.o test2.o
test1.o: test1.c
test2.o: test2.c
clean:
   rm test test.o test1.o test2.o

错误:
test-1.0编译后会出现"multiple definition of"错误。

错误分析:
由于工程中的每个.c文件都是独立的解释的,即使头文件有
#ifndef _TEST_H_
#define _TEST_H_
....
#enfif
在其他文件中只要包含了global.h就会独立的解释,然后每个.c文件生成独立的标示符。在编译器链接时,就会将工程中所有的符号整合在一起,由于文件中有重名变量,于是就出现了重复定义的错误。

解决方法
在.c文件中声明变量,然后建一个头文件(.h文件)在所有的变量声明前加上extern,注意这里不要对变量进行的初始化。然后在其他需要使用全局变量的.c文件中包含.h文件。编译器会为.c生成目标文件,然后链接时,如果该.c文件使用了全局变量,链接器就会链接到此.c文件 。

test-2.0
复制代码 代码如下:
# vi test.c
-------------------------------
#include
#include "test.h"

int i = 10;
char add1[] = "www.shellbox.cnn";
char add2[] = "www.scriptbox.cnn";
extern void test1();
extern void test2();

int main()
{
   test1();
   printf("okn");
   test2();
   printf("%dn",i);
   return 0;
}


# vi test.h
-------------------------------
#ifndef _TEST_H_
#define _TEST_H_

extern i;
extern char add1[];
extern char add2[];

void test1();
void test2();

#endif

# vi test1.c
-------------------------------
#include
#include "test.h"

void test1()
{
   printf(add1);
}

# vi test2.c
-------------------------------
#include
#include "test.h"

void test2()
{
   printf(add2);
   for (; i > 0; i--)
       printf("%d-", i);
}

个人认为解决此类问题有几种办法:
1.在.cpp里定义变量,在其他调用处使用extern
2.在头文件里使用宏定义

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/66196.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号