我在文件顶部的#include指令后面定义了以下变量;
#include
int a = 5; int b = a;
但是我得到一个编译时错误。我知道全局变量隐式地具有静态存储持续时间,但我不确定这是如何或是否与此错误的原因有关。
mcdcgff01#
正如你所说,全局变量隐式地具有静态存储持续时间。这是因为全局变量是在编译时初始化的。这就是为什么你得到一个错误的原因。来自C99标准6.7.8:具有静态存储期限的对象的初始化器中的所有表达式都必须是常量表达式或字符串文字。为了克服这一点,你可以使用下面的“技巧”。
int a = 5; int b; int main() { b = a; //rest of code goes here. }
8yparm6h2#
需要一个常量表达式来初始化一个全局变量,尽管a在这个上下文中看起来是完全常量,但编译器并不这么看。当我阅读代码时,目标是用在一个点定义的相同值初始化a和b。实现这一点的一种方法是为a和b定义公共初始化器:
a
b
#define INIT 5 int a = INIT; int b = INIT;
2条答案
按热度按时间mcdcgff01#
正如你所说,全局变量隐式地具有静态存储持续时间。这是因为全局变量是在编译时初始化的。这就是为什么你得到一个错误的原因。
来自C99标准6.7.8:
具有静态存储期限的对象的初始化器中的所有表达式都必须是常量表达式或字符串文字。
为了克服这一点,你可以使用下面的“技巧”。
8yparm6h2#
需要一个常量表达式来初始化一个全局变量,尽管
a
在这个上下文中看起来是完全常量,但编译器并不这么看。当我阅读代码时,目标是用在一个点定义的相同值初始化
a
和b
。实现这一点的一种方法是为
a
和b
定义公共初始化器: