Ý tưởng đằng sau yêu cầu này là phải có tất cả đối tượng thời lượng lưu trữ tĩnh được khởi tạo lúc biên dịch. Trình biên dịch chuẩn bị tất cả các dữ liệu tĩnh ở dạng được khởi tạo trước để nó không yêu cầu mã khởi tạo bổ sung trong thời gian chạy. I E. khi chương trình được biên dịch được nạp, tất cả các biến như vậy bắt đầu cuộc sống của chúng trong trạng thái đã được khởi tạo.
Trong phiên bản tiêu chuẩn hóa đầu tiên của ngôn ngữ C (C89/90), yêu cầu này cũng được áp dụng cho các trình khởi tạo tổng hợp, ngay cả khi chúng được sử dụng với các biến cục bộ.
void foo(void)
{
int a = 5;
struct S { int x, y; } s = { a, a }; /* ERROR: initializer not constant */
}
Rõ ràng lý do cho hạn chế đó là trình khởi tạo tổng hợp được cho là được xây dựng trước trong phân đoạn dữ liệu được khởi tạo trước, giống như biến toàn cầu.
'i' là một biến, không phải là một hằng số. Và C không cho phép khởi tạo không liên tục cho các biến toàn cầu hoặc tĩnh. C khác với C++ ở khía cạnh này. –
@ATaylor Nope. const int doesnt giải quyết nó. –
@ user963472: Trong C (không giống như C++), khai báo 'const' không tạo ra các biểu thức liên tục. –