2012-12-09 28 views
6
#include <stdio.h> 

int i=10; 
int j=i; 
int main() 
{ 
    printf("%d",j); 
} 

Tôi gặp lỗi khi nói rằng phần tử khởi tạo không phải là hằng số? lý do đằng sau này là gì?Định nghĩa các biến toàn cầu bằng cách sử dụng trình khởi tạo không liên tục

+0

'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. –

+0

@ATaylor Nope. const int doesnt giải quyết nó. –

+1

@ 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. –

Trả lời

12

Lý do đằng sau điều này là gì?

C (không giống như C++) không cho phép khởi tạo giá trị toàn cầu với giá trị không đổi.

C99 Tiêu chuẩn: Mục 6.7.8:

Tất cả những biểu hiện trong một initializer cho một đối tượng có thời gian lưu trữ tĩnh sẽ biểu thức không đổi hoặc xâu.

+0

Tôi thấy trên internet rằng các biến với lưu trữ tĩnh được cấp phát tại thời gian tải. Điều này có bất cứ điều gì để làm với câu hỏi trên của tôi. –

+0

@ user963472: Tôi không hiểu câu hỏi của bạn. Bạn có thể vui lòng xây dựng? –

2

Bạn có thể thử sử dụng:

int i=10; 
int j=0; 

int main() 
{ 
    j=i;//This should be the first statement in the main() and you achieve the same functionality as ur code 
    return 0; 
} 

Các chỉ C cách thật sự là để khởi tạo nó khi chạy. Mặc dù trong C++ mã của bạn sẽ hoạt động tốt, không có bất kỳ lỗi biên dịch nào.

Tiêu chuẩn C rõ ràng cấm khởi tạo đối tượng chung với các giá trị không đổi. Các Section 6.7.8 của tiêu chuẩn C99 nói:

Tất cả những biểu hiện trong một initializer cho một đối tượng có thời gian lưu trữ tĩnh sẽ biểu thức không đổi hoặc xâu.

Định nghĩa của một đối tượng với static storage duration là trong phần 6.2.4:

Một đối tượng có nhận dạng được khai báo với bên ngoài hoặc nội bộ liên kết, hoặc qua các nhân tĩnh lưu trữ lớp specifier có lưu trữ tĩnh Thời lượng . Tuổi thọ của nó là toàn bộ việc thực hiện chương trình và giá trị được lưu trữ chỉ được khởi tạo một lần, trước khi khởi động chương trình.

1

Ý 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.

0

Sử dụng này: -

int i=10,j=1; 
int main() 
{ 
    printf("%d",j); 
} 

Mặc dù nó là một thay đổi nhỏ nhưng nó sẽ làm việc

Các vấn đề liên quan