当前位置:  编程技术>c/c++/嵌入式

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

    来源: 互联网  发布时间:2014-10-20

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

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.在头文件里使用宏定义

    
 
 

您可能感兴趣的文章:

  • linux内核怎么定义汇编全局变量及在c文件中使用这个变量?有关0。11下的字符回显
  • C++多文件变量解析
  • 一个.java文件中怎样来调用另一个.java文件中的变量及其它东西!
  • 一个包含文件引起的变量重复定义的问题,高手请援助!
  • linux 如何在两个.c文件中引用对方的变量。
  • 环境变量存放在哪个文件中?
  • 请问初试加载环境变量的文件除了/etc/profile还有哪个
  • 从elf文件中读变量信息
  • 在ACC变成中要使用发ftp传送文件,但文件名不确定,请问怎么样在程序的FTP中使用字符串变量???
  • shell文件变量的问题
  • 请问如何在jsp中include一个可变的变量文件名,谢谢!
  • redhat7.2下怎么在shell文件中以变动日期做为变量?急!!
  • JSP页面中能定义文件输出流变量吗?
  • 我修改了/etc/profile文件中的classpath变量,用什么方式使之生效
  • gdb如何将变量结果输入到文件?
  • 请问:如何获取文件系统/home的占有量,赋值与变量a
  • 如何把find后的文件名放到变量中?
  • shell中读取一个文本文件将内容按行保存成数组变量
  • awk参数中文件名是变量的情况
  • linux下INCLUDE、LIB这些环境变量在哪个配置文件中定义?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 通过shell解析文件,并根据解析内容生成新的文件。
  • 如何用libxml2 默认解析器解析HTML文件
  • 请问怎样手工的解析XML文件啊.( 不借助任何的xml解析器)急!!!
  • 请问各位:我用SUN公司的JAXP开发包解析XML文档,可不知道对XML解析后如何将结果写回文件中。请各位熟悉Java和XML的高手帮忙。
  • 如何边下载XML文件并对其进行解析呢?
  • 系谱文件解析软件 phpGedView
  • .msg 文件解析库 msgparser
  • linux下如何解析xml文件????
  • 配置文件解析器库 libconfuse
  • libxml2库解析xml文件出现的问题
  • DELTA 文件解析 DeltaQt
  • PAC文件解析库 pacparser
  • C++配置文件解析 C++ Configurator
  • Linux下重编译PHP后Apache竟然不能解析.php文件?
  • 求教脚本高手:如何解析如下文件
  • 请问:/etc/hosts文件编辑后,,#host www.a.com,为什么不能解析呢?
  • zip文件解析包 ZZIPlib
  • java读取csv文件示例分享(java解析csv文件)
  • PSD文件解析库 libspsd
  • 解析MYSQL 数据库导入SQL 文件出现乱码的问题
  • C++ I/O 成员 eof():如果处于文件结尾处则返回true
  • Shell脚本如何递归现实一个文件夹中的文件(文件夹中含有文件夹)
  • WinDows8最新版文件夹加密
  • 求命令:什么命令可以把文件夹下所有的文件按修改时间先后排出来,包括子文件夹里的文件。
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • [提问]Linux下如何把多个.a文件编译一个.so文件,或者把多个.so文件编译成一个.so文件
  • python异常信息堆栈输出到日志文件
  • 请问:proc中的头文件中能包含头文件吗?(感觉如果头文件中包含头文件的话,在链接时就会有错误啊)
  • Centos6下安装Shell下文件上传下载rz,sz命令
  • 我要实现当进程打开文件时,根据文件名判断是否符合要求,符合后处理文件,再把文件返回给进程,怎么实现啊


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3