Tôi đã tìm thấy một thực tế thú vị và tôi không hiểu nó hoạt động như thế nào.
Đoạn mã sau đây hoạt động hoàn hảo.Kích thước mảng với biến const trong C
#include <stdio.h>
int main(){
const int size = 10;
int sampleArray[size];
typedef char String [size];
return 0;
}
Sau đó, tôi đã cố gắng chỉ sử dụng và chỉ biến cố định có phạm vi toàn cầu và vẫn ổn.
#include <stdio.h>
const int size = 10;
int main(){
int sampleArray[size];
typedef char String [size];
return 0;
}
Nhưng, nếu tôi thay đổi phạm vi của mảng để toàn cầu là tốt, tôi đã nhận như sau:
error: variably modified ‘sampleArray’ at file scope
#include <stdio.h>
const int size = 10;
int sampleArray[size];
typedef char String [size];
int main(){
return 0;
}
Và tôi đã không nhận được nó! Nếu tôi thay thế biến const cho ví dụ cũ. đến #define
cũng sẽ ổn thôi.
Tôi biết rằng biến #define đã được xử lý trước và theo như tôi biết biến const chỉ là chỉ đọc. Nhưng điều gì làm cho phạm vi toàn cầu sau khi tất cả?
Tôi không hiểu vấn đề với đoạn mã thứ ba là gì, nếu điều thứ hai là không sao.
Một số chi tiết: C có các đối tượng 'const' nhưng không phải là đối tượng _constant_. Mặc dù 'const' dường như ngụ ý _constant_, một đối tượng' const' không phải là _constant_, nhưng giống như "đối tượng này không nên thay đổi, nhưng nếu thay đổi được thử - ai biết điều gì có thể xảy ra?" Trong C, một _constant_ đúng là mã như '42', là hằng số _integer_ với kiểu' int'. Do đó 'const int size = 10;' không phải là biến _constant_. – chux
Mảng không có kích thước không đổi, nhưng là mảng có độ dài thay đổi. – Olaf
Giống như họ đã nói, C có các đối tượng 'const', đó là các biến * chỉ đọc thực *. Cf. C++, trong đó có các đối tượng 'const' thực sự là các hằng số * thời gian biên dịch *. –