C与C++对于全局变量的不一样处理之处

下面看看我犯的错误:

    当时写了一个相似于下面的枚举:php

    #ifndef TEST_ENUM_H_web

    #define TEST_ENUM_H_ui

    enum {spa

    TEST_FLAG1_E,.net

    TEST_FLAG2_E,unix

    TEST_FLAG_NRblog

    } TEST_E;ip

    #endif产品

    当时在enum关键字前面遗漏了“typedef”。我通常习惯于使用typedef,这样能够直接使用TEST_E而不是enum TEST_E。it

    该头文件会被其它源文件引用。因为在代码中,没有须要定义枚举变量的地方,只是使用枚举的值,因此当时没有发现遗漏“typedef”。编译也没有任何问题。

    可是当天的build却没有经过。错误信息显示定义了重复的TEST_E,所以编译失败。因为与美国的时差问题,这个错误由美国的一同事修改了。他陈述的错误缘由是:这样的枚举声明对于C来讲,是没有问题的。——咱们的核心代码都是C编写的。

    可是对于C++,会认为不是声明而是定义,定义了一个TEST_E变量。结果致使重复定义了该变量。——有一部分web功能代码是使用C++编写的。

    当我早上看到他的说明时,首先要对break build表示歉意;第二也鄙视了一下该产品的makefile——我刚刚加入这个产品组。这样的makefile,为了检查checkin,我不得不先make clean才能保证全部的代码被编译。这样花费的时间太多了。第三,我才想起web的这部分功能是使用C++的。第四,寒一下本身,竟然漏写了typedef;第五,也有些好奇C++的编译为何出错。

    可是当我看到他的陈述时,我知道他确定错了。对于C和C++来讲,枚举enum的区别不会这么大。对于上面那个枚举类型定义,因为遗漏了typedef,因此这里的TEST_E不管是C仍是C++来讲,都会把TEST_E看成一个枚举变量处理,也就是一个全局变量。那么引发问题的缘由是由于C和C++对于没有初始值的全局变量的处理不一样——真拗口,而最后的编译连接行为不一样。

    看下面的简单示例:

    文件test1.c

    int a;

    int main()

    {

    return 0;

    }

    文件tes2.c

    int a;

    编译

    [fgao@fgao-vm-fc13 test]$ gcc -g -Wall test1.c test2.c

    [fgao@fgao-vm-fc13 test]$

    编译没有任何的warning和error。对于没有初始值的全局变量,其为弱符号。对于多个弱符号定义,在C的连接阶段不会有任何问题。你们能够参见我这篇文章经过未初始化全局变量,研究BSS段和COMMON段的不一样 http://blog.chinaunix.net/space.php?uid=23629988&do=blog&id=2888209

    在这篇文章中,我解释了为何C容许多个弱符号存在

    下面将其视为C++代码,使用g++编译:

    [fgao@fgao-vm-fc13 test]$ g++ -g -Wall test1.c test2.c

    /tmp/ccQdTwRi.o:(。bss+0x0): multiple definition of `a'

    /tmp/cc7SOWD1.o:/home/fgao/works/test/test1.c:4: first defined here

    collect2: ld returned 1 exit status

    一样是没有初始值的全局变量,在C++的连接阶段就会报错。对于C++为何报错,这确定是因为C++的连接机制有关。目前我并不清楚缘由,有了解的朋友请赐教。谢谢。

相关文章
相关标签/搜索