【问题标题】:defining extern variable inside of the scope and outside of the scope在范围内和范围外定义外部变量
【发布时间】:2021-08-18 01:18:57
【问题描述】:

我在作用域内和作用域外定义了extern a

交流

int a;

void foo(void)
{
    a = 3;
}

b.c

extern int a = 10; /*same as "extern a; int a = 10?" */


void foo(void);

int main(void)
{
    foo();
    printf("%d", a);
}

这段代码定义明确吗?

【问题讨论】:

  • int a; 定义变量。然而extern int a = 10; 定义了它。应该只有一个定义。所以我建议你在第一个文件中将其更改为int a = 10;,在第二个文件中更改为extern int a;,这样就只是一个声明。
  • 我认为这表明人们普遍缺乏对 extern 关键字的理解,并不是说这有什么问题,我是如何翻阅我的笔记并将其标记为解释关键字的体面来源的。 journaldev.com/38985/extern-keyword-in-c
  • 你为什么要这样做?
  • 有人问我这个问题。
  • @도라에몽1 最好在头文件中声明变量。

标签: c syntax


【解决方案1】:

由于a 的多重定义,这会导致标准 C 中的未定义行为。

实现有一个通用扩展,允许多个定义,只要最多一个被初始化。

更多详情请见:Is having global variables in common blocks an undefined behaviour?


extern int a = 10;int a = 10; 相同,与 extern int a; int a = 10; 相同。变量定义具有外部链接,除非指定为静态(或在同一范围内已声明为静态的标识符)。

【讨论】:

  • 谢谢你,但是 int a;是诱人的定义,并且有外部定义,所以不会对声明进行更改吗?还是定义吗?
【解决方案2】:

extern int a = 10;int a = 10; 相同

如果您同时拥有这两个代码,则代码不会链接,因为您的项目中将有多个静态存储变量 a 的定义。

【讨论】:

  • 是UB,不需要诊断,所以不一定是链接错误
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 2011-06-01
  • 2015-01-01
  • 2016-06-23
  • 1970-01-01
  • 2016-03-14
  • 2018-08-09
  • 1970-01-01
相关资源
最近更新 更多