【问题标题】:How is the value of global variable changing in my code?我的代码中全局变量的值如何变化?
【发布时间】:2019-11-28 02:18:27
【问题描述】:

我在主函数之后再次声明了全局变量,但它仍然影响主函数。我知道 C 允许在第一次声明未初始化变量时再次声明全局变量(它在 c++ 中不起作用)。如果我在 main 函数之后分配值,它仍然可以在 c 中出现两个警告,但在 c++ 中会出错。

我已经调试了代码,但它从未到达int a=10; 行。

#include <stdio.h>
#include <string.h>

int a;

int main()
{
    printf("%d",a);
    return 0;
}
/*a=10  works fine with following warnings in c.
        warning: data definition has no type or storage class
        warning: type defaults to 'int' in declaration of 'a' [-Wimplicit-int]|

        but c++ gives the following error
        error: 'a' does not name a type|
*/
int a=10;

输出是10

【问题讨论】:

标签: c global-variables


【解决方案1】:

几件事:

  • 第一个int a;是暂定声明;第二个int a = 10; 是一个定义声明。

  • a 在文件范围内声明,因此它将具有 static 存储持续时间 - 这意味着它的存储将在程序启动时(在 main 执行之前)被留出并初始化,即使定义声明出现在源代码的后面。

  • 旧版本的 C 允许隐式声明 int - 如果变量或函数调用出现时没有声明,则假定其类型为 int。 C++ 不支持隐式声明,所以会报错。

【讨论】:

    【解决方案2】:

    这里

    int a; /* global declaration */
    

    编译器将上述语句视为声明 不是定义。它在其他翻译单元中查找a 的定义,它在main() 下方查找为

    int a=10;
    

    因此输出10

    为避免出现警告,请声明 aextern 存储类,例如

    extern int a;
    

    【讨论】:

    • 因为 C++ 是与 C 不同的语言,尽管有许多相似之处。
    • 由于C++ 是严格的类型检查,它会给出错误。用extern 声明 C++ 将允许它。
    【解决方案3】:

    来自 C 标准#6.9.2p2

    2 具有文件范围的对象的标识符声明没有初始化程序,没有存储类说明符或具有存储类说明符 static,构成 暂定定义... ..

    所以,这个

    int a;
    

    是标识符a的暂定定义。

    关于暂定定义的几点:

    • 如果在同一个翻译单元中没有定义,那么暂定定义将作为具有初始值设定项= 0 的实际定义。
    • 如果在同一翻译单元中较早或较晚地找到了实际的外部定义,则暂定定义仅用作声明。

    在你的程序中,编译器在同一个翻译单元中找到了a的定义:

    int a=10;
    

    因此,在使用 C 编译器进行编译时,您将获得输出 10

    现在,关于使用 C++ 编译器编译时的错误:

    如果你的程序中有这样的语句:

    a=10;
    

    这将在使用 C++ 编译器编译时出错,因为您缺少所需的类型说明符。但是这段代码将使用 C 编译器编译,因为在旧版本的 C (C89/90) 中,如果缺少类型说明符,那么它将默认设置为 int。当然,使用 C99 和 C11 编译器编译时会收到警告消息,因为不再支持此隐式声明。

    如果你的程序中有这样的语句:

    int a=10;
    

    C++ 没有暂定定义的概念,int a; 是 C++ 中的定义。因此,由于 One Definition Rule 的概念,C++ 编译器将给出错误 - redefinition of 'a'

    【讨论】:

      【解决方案4】:

      据我所知,今天的 c++ 编译器无法运行代码:

      int a;
      int main()
      {
          printf("%d",a);
          return 0;
      }
      int a=10;
      

      也没有

      int a;
      int main()
      {
          printf("%d",a);
          return 0;
      }
      a=10;
      

      因为 c++ 检测到变量的双重声明。

      因为它不能在方法之外初始化变量。

      错误“'a'没有命名类型”是因为那个(第二个)错误,c ++期望第一个单词是声明类型(例如:int,long,char,-etc-),并且变量是给定的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-27
        • 1970-01-01
        • 2016-12-23
        • 1970-01-01
        • 2012-09-28
        • 2021-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多