2011-11-03 19 views
5
const int num = 16; 
struct inputs{ 
     double X1[num]; 
     double X2[num]; 
}; 

Cung cấp cho tôi một lỗi:Mảng Kích khác biệt Tuyên bố Đối với C và C++

error: variably modified ‘X1’ at file scope

Cùng là đúng đối với 'X2.

Nhưng tôi nhớ ở trên là tốt cho C++, ở trên là tốt (tôi có thể nhầm lẫn với C + +).

Ai có thể làm rõ điều này cho tôi không?

Trả lời

3

Có, có sự khác biệt. Trong C, biến số const vẫn không được coi là hằng số biên dịch đúng thời gian (chính thức, nó không được phép là một phần của constant expression), vì vậy điều này không được phép. Tuy nhiên, lưu ý rằng mặc dù C không yêu cầu trình biên dịch cho phép nó, nhưng tiêu chuẩn không cho phép thực hiện chấp nhận các biểu thức khác của các biểu thức không đổi, do đó, nó miễn phí chấp nhận nó nếu nó chọn.

Trong C++, biến số const được coi là hằng số, vì vậy nó được cho phép.

Điều thú vị là khoảng ngược lại là đúng khi bạn sử dụng một giá trị thông qua như là một tham số chức năng:

void f(int size) { 
    int array[size]; 
} 

Đây là phép trong C, nhưng không phải trong C++. Đây là mảng variably modified; thông báo lỗi mà bạn đang nhận được về cơ bản đang cố gắng cho bạn biết rằng chúng chỉ được phép bên trong các hàm.

+0

Trong C, bạn có thể chuyển kích thước của mảng cho một hàm? Đã học ! Cảm ơn! – Rich

+0

@Rich: có, nhưng chỉ khi trình biên dịch của bạn phù hợp với C99 (ít nhất là trong khía cạnh này) - điều này đã không được bao gồm trong C89/90 (mặc dù nó là một phần mở rộng khá phổ biến ngay cả với trình biên dịch cũ). –

0

Không có cấu trúc. Bạn có thể làm điều đó trong phạm vi địa phương.

+0

Ngay cả đối với C? Theo các câu trả lời khác, nó không thể cho C. có thể ok cho C + +? – Rich

+3

Chỉ trong C99, không phải trong C89. –

+0

Tôi tin tưởng Adam, bởi vì tôi không nhớ tiêu chuẩn chính xác. Phiên bản của anh ấy nghe có vẻ hợp lý. –

0

Bạn phải sử dụng giá trị không đổi. Vì vậy, trong C bạn phải sử dụng một #define trong lĩnh vực này. Đối với C++ nó sẽ ổn thôi.

Sử dụng này để thay thế:

#define num 16 
struct inputs{ 
    double X1[num]; 
    double X2[num]; 
}; 
+0

err .. '# define' trong phạm vi? –

+0

Lựa chọn từ sai, có ý nghĩa. –

+0

tốt hơn :) –

0

Trong C++, biên dịch hằng số thời gian có thể được sử dụng như độ dài trong tờ khai mảng và const biến (chỉ có một số trong số họ) có thể là thời gian biên dịch hằng số. Đây là lý do tại sao nó sẽ làm việc trong C++. Tuy nhiên,

C, có một tính năng trông tương tự, mảng có độ dài biến đổi. Nó có nghĩa là bạn có thể sử dụng bất kỳ biểu thức số nguyên (thậm chí thời gian chạy tính toán) như chiều dài mảng, nhưng chỉ cho các biến địa phương. Đây là lý do tại sao trình biên dịch của bạn phàn nàn về "variably modified 'X1' ở phạm vi tệp".

0

Như đã nói bởi những người khác C và C++ khác nhau về biểu thức số nguyên không đổi.

Nhưng bạn không phải sử dụng macro khi những người khác được đề xuất có mã hoạt động với cả hai. Nếu bạn muốn làm điều đó với "phạm vi", bạn có thể làm điều đó với một hằng số liệt kê.Một cái gì đó như

enum { num = 16 }; 
struct inputs { 
    double X1[num]; 
    double X2[num]; 
}; 

sẽ hoạt động cho cả hai, bất kể bạn đặt điều này trong phạm vi tệp hoặc chức năng.