I've found an interesting fact, and I didn't understand how is it works.
The following piece of code just works perfectly.
#include <stdio.h>
int main() {
const int size = 10;
int sampleArray[size];
typedef char String [size];
return 0;
}
Then, I tried to use only and only the constant variable with a global scope, and it's still fine.
#include <stdio.h>
const int size = 10;
int main() {
int sampleArray[size];
typedef char String [size];
return 0;
}
But, if I change the arrays's scope to global as well, I got the following:
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;
}
And I didn't get it! If I'd replace the const variable for ex. to #define
it'd be okay as well.
I know that the #define variable is preprocessed, and as far as I know the const variable is only read-only. But what does make the global scope after all?
I don't understand what is the problem with the third piece of code, if the second one is just okay.
Variable-length arrays (VLAs) may have only automatic storage duration. VLAs were introduced in C99.
It is not allowed to declare a VLA with the static storage duration because the size of VLA is determined at the run time (see below).
Before this Standard, you can use either a macro like
#define SIZE 10
//...
int a[SIZE];
or a enumerator of an enumeration like
enum { SIZE = 10; }
//...
int a[SIZE];
By the way, you may remove the const qualifier and just write
int size = 10;
instead of
const int size = 10;
(In C++ you have to use the const qualifier though. In C++, there aren't any VLAs, except that some compilers can have their own language extensions.)
Take into account that the sizeof
operator for VLAs is calculated at the run time instead of the compile time.