2015-04-30 33 views
5

Biên dịch mã sau bằng gcc.Tại sao không thể trong C để khởi tạo một hằng số với hằng số khác?

Code:

#include <stdio.h> 
const int i = 10; 
const int n = i+1; 
int main() { 
    printf("%i\n", i); 
    printf("%i\n", n); 
} 

Lỗi:

tôi nhận được một lỗi biên dịch như dưới đây

test.c:3:5: error: initializer element is not constant 
const int n = i+1; 
^ 

Biên soạn với g ++ làm việc tốt và in 10 và 11.

Tôi đã sử dụng gcc 4.9.2

+4

Có thể thấy câu trả lời này: http://stackoverflow.com/a/3025106/4384927 – Chostakovitch

Trả lời

0

static biến cần phải được khởi tạo với hằng số.
Trình biên dịch C++ sẽ biên dịch nó vì trong C++ const biến đủ điều kiện là các hằng số. Trong C, const biến đủ điều kiện không phải là hằng số và trình biên dịch C sẽ làm tăng lỗi.

+1

Nhưng 'g ++' tính toán 'i + 1' tại thời điểm biên dịch. – Thilo

+4

@Thilo g ++ là trình biên dịch C++ và trong C++, các quy tắc cho các hằng số là khác nhau. Trong C++, một hằng số có thể được khởi tạo với một giá trị được đánh giá khi chạy. Const trong C++ có nghĩa là khi đã được khởi tạo, bạn không thể thay đổi giá trị của nó nữa. – rozina

+0

@rozina: Nhưng đó không phải là trường hợp ở đây. Trong trường hợp này (đối với C++), 'i + 1' được đánh giá tại thời gian biên dịch. 'i',' i + 1' và 'n' là tất cả các biểu thức hằng số thời gian biên dịch trong mã này. –

1

Biến số const có thể được initalized với các giá trị không đổi (biểu thức không đổi).


  • Trong C

Vào lúc biên soạn, i + 1 không phải là một biểu thức hằng.

FWIW, thậm chí

const int n = i; 

sẽ cung cấp cho bạn lỗi, bởi vì, ngay cả khi khai báo là const, i không thể được sử dụng như biểu thức hằng được sử dụng như một initalizer để const khác.


  • Trong C++

const biến được tread biểu hiện như liên tục nếu chúng được khởi tạo với các biểu thức không đổi. Vì vậy, điều này được cho phép.

+1

Nhưng g ++ tính toán i + 1 nó tại thời gian biên dịch rõ ràng. – Thilo

+1

@ Thilo Vâng, trong trường hợp đó, 'C' và' C++ 'là các ngôn ngữ khác nhau và được xử lý tốt hơn theo cách đó. –

+2

* "biến const là tread như biểu thức liên tục" * - * Nếu * chúng được khởi tạo với các biểu thức liên tục. –

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