Reputation: 2630
I want to create a constant static array to be used throughout my Objective-C implementation file, similar to something like this at the top level of my ".m" file:
static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = {
1,
2,
3,
4 };
I plan on using NUM_TYPES
later on in the file, so I wanted to put it in a variable.
However, when I do this, I get the error
"Variably modified 'types' at file scope"
I gather that this may have something to do with the array size being a variable (I don't get this message when I put an integer literal there, like static int types[4]
).
I want to fix this, but maybe I am going about it all wrong...I have two goals here:
NUM_TYPES
into a variable, so I don't have the same literal scattered about different places in my fileWhat can I do?
I found this in the C FAQ (11.8): I don't understand why I can't use const values in initializers and array dimensions
Upvotes: 92
Views: 125584
Reputation: 5811
The reason for this warning is that 'const' in C doesn't mean constant. It means "read-only". So the value is stored at a memory address and could potentially be changed by machine code.
Upvotes: 67
Reputation: 57
IMHO, this is a flaw in many C compilers. I know for a fact that the compilers I worked with do not store a "static const" variable at an address, but replace the use in the code by the very constant. This can be verified as you will get the same checksum for the produced code when you use a preprocessors #define directive and when you use a static const variable.
Either way, you should use static const variables instead of #defines whenever possible as the static const is type-safe.
Upvotes: 3
Reputation: 21779
As it is already explained in other answers, const
in C merely means that a variable is read-only. It is still a run-time value. However, you can use an enum
as a real constant in C:
enum { NUM_TYPES = 4 };
static int types[NUM_TYPES] = {
1, 2, 3, 4
};
Upvotes: 10
Reputation: 111
It is also possible to use enumeration.
typedef enum {
typeNo1 = 1,
typeNo2,
typeNo3,
typeNo4,
NumOfTypes = typeNo4
} TypeOfSomething;
Upvotes: 11
Reputation: 239041
If you're going to use the preprocessor anyway, as per the other answers, then you can make the compiler determine the value of NUM_TYPES
automagically:
#define NUM_TYPES (sizeof types / sizeof types[0])
static int types[] = {
1,
2,
3,
4 };
Upvotes: 35