That depends on how you use them, Aia. In reality they are not constants: they are macros that happen to expand to particular text. After the macro is #defined, the preprocessor substitutes every instance of the macro name (eg LEN) with it's replacement text.
In agentsmith's example, there are no constants or variables named LEN or HASHSIZE seen by the compiler.
For example, the typedef that declares List is effectively seen by the compiler as;
Code:
typedef struct L { char k[20]; struct L *next; } List;
Unlike a declaration of a constant, a macro can be redefined. For example;
Code:
int main()
{
#define LEN 20
int a[LEN];
#undef LEN
#define LEN 50
int b[LEN];
for (i = 0; i < LEN; ++i) a[i] = 42;
return 0;
}
will declare a to be an array of 20 elements and b to be an array of 50 elements. The loop also invokes undefined behaviour becase it sets 50 elements of the array a, which only has 20 elements.