代码之家  ›  专栏  ›  技术社区  ›  coelhudo

在C++中编译全局变量的重新声明错误,但不在C中编译

  •  9
  • coelhudo  · 技术社区  · 15 年前

    假设我有这三个文件:

    A.

    //a.h header
    #include <stdio.h>
    int int_variable;
    
    void a_f()
    {
       printf("int_variable: %d\n", int_variable)
       int_variable++;
    }
    

    B.H

    //b.h header
    #include <stdio.h>
    int int_variable;
    
    void b_f()
    {
       printf("int_variable: %d\n", int_variable)
       int_variable++;
    }
    

    主C

    //main.c
    #include "a.h"
    #include "b.h"
    
    int main()
    {
       a_f();
       b_f();
       return 0;
    }
    

    为什么编译在C++中会产生重新定义错误,但是在C中却没有? 我是C++开发人员,那么C++对我来说是有意义的,但是为什么在C中这不是一个错误呢?

    当我执行C生成的代码时,输出是:

    int变量:0

    int变量:1

    2 回复  |  直到 12 年前
        1
  •  7
  •   R Samuel Klatchko    15 年前

    在C语言中,两个变量实际上合并为一个变量,因为两者都没有显式初始化。

    如果将两个H文件都更改为:

    // a.h
    int int_variable = 0;
    

    以及:

    // b.h
    int int_variable = 0;
    

    您将得到一个重新定义错误。

        2
  •  2
  •   Ben Voigt    15 年前

    头文件中的全局变量只能与“extern”修饰符一起使用。没有例外。forward在一个或多个头文件(最好只有一个)中声明变量,然后在一个编译单元中定义它。