C 文件范围内的变量未使用其他变量初始化

C 文件范围内的变量未使用其他变量初始化,c,C,有人能解释一下为什么这个底层代码要为初始化寻找一个常量值吗?在函数中执行相同的操作不会引起任何问题(即使另一个变量(本例中为b)是常量) #包括 INTA=9; int b=a; int main() { 返回0; } 刚才有人问了一个类似的问题(不知道怎么问),但答案只是因为语言的设计规范这么说(这是没有帮助的)-有人能解释这样做的目的吗?您显示的A和b对象具有静态存储时间,这意味着它们在程序的整个执行过程中都存在。2011年版的C标准(草案N1570)第6.7.9条第4款规定,“具有静态或

有人能解释一下为什么这个底层代码要为初始化寻找一个常量值吗?在函数中执行相同的操作不会引起任何问题(即使另一个变量(本例中为b)是常量)

#包括
INTA=9;
int b=a;
int main()
{
返回0;
}

刚才有人问了一个类似的问题(不知道怎么问),但答案只是因为语言的设计规范这么说(这是没有帮助的)-有人能解释这样做的目的吗?

您显示的
A
b
对象具有静态存储时间,这意味着它们在程序的整个执行过程中都存在。2011年版的C标准(草案N1570)第6.7.9条第4款规定,“具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字。”

C没有计算静态对象初始值的任何规定。它们的值需要在编译时确定,或者是可由链接器或加载程序计算的可重定位地址。可重定位地址作为简单表达式计算,这些表达式是程序部分加载到内存中的函数

在没有
extern
static
的函数内声明的对象(从技术上讲,在块内,在函数定义内)具有自动存储持续时间。C标准允许使用在运行时计算的表达式对其进行初始化。编译器实现这一点相对容易,因为他们只需在函数的开头放上计算值的代码


理论上,C标准允许您使用运行时计算的值初始化静态对象,而实现可以通过包含在
main
之前执行的代码来实现这一点。其他编程语言也有这样的特性。然而,这会带来复杂的情况。例如,如果您编写
extern intb;int a=3*b
extern inta;INTB=a+4您显示的
a
b
对象具有静态存储持续时间,这意味着它们在整个程序执行过程中都存在。2011年版的C标准(草案N1570)第6.7.9条第4款规定,“具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字。”

C没有计算静态对象初始值的任何规定。它们的值需要在编译时确定,或者是可由链接器或加载程序计算的可重定位地址。可重定位地址作为简单表达式计算,这些表达式是程序部分加载到内存中的函数

在没有
extern
static
的函数内声明的对象(从技术上讲,在块内,在函数定义内)具有自动存储持续时间。C标准允许使用在运行时计算的表达式对其进行初始化。编译器实现这一点相对容易,因为他们只需在函数的开头放上计算值的代码


理论上,C标准允许您使用运行时计算的值初始化静态对象,而实现可以通过包含在
main
之前执行的代码来实现这一点。其他编程语言也有这样的特性。然而,它会带来并发症。例如,如果您编写
extern intb;int a=3*b
extern inta;INTB=a+4
i
尚未定义,但即使是is,语言规则说使用的值必须是常量,所以即使定义
const int i
,也没有用。在哪里声明“i”?“因为语言这么说”是唯一有效的答案。@dbash:If“因为语言这么说”是唯一有效的答案,为什么存在?为什么反对票?这是一个正确提出的问题,并且有一个答案。
i
尚未定义,但即使是,语言规则说使用的值必须是常量,所以即使定义
const int i
,也没有用。声明“i”的位置在哪里?“因为语言这么说”是唯一有效的答案。@dbash:If“因为语言这么说”是唯一有效的答案,为什么存在?为什么反对票?这是一个正确提出的问题,有一个答案。我理解的是变量a和b可以从其他翻译单元访问,并且不能保证
b
将在
a
之后访问,因此编译器会抛出一个错误,但即使我将
b
设为
static
没有帮助-抛出相同的错误。我的意思是
static
关键字
b
的链接应该是内部链接。全局变量应该在单个转换单元中从上到下顺序初始化。我理解的是变量a和b可以从其他位置访问翻译单位,并且不能保证
b
将在
a
之后被访问,因此编译器会抛出一个错误,但即使我将
b
设为
静态
也无济于事-抛出相同的错误。我的意思是
静态#include<stdio.h>

int a=9;
int b=a;

int main()
{
   return 0;
}