My preprocessor appears to assume that undefined constants are 0 for the purpose of evaluating #if
conditions.
Can this be relied upon, or do undefined constants give undefined behaviour?
Referring to a class constant without specifying the class scope.
C has no specific undefined value. A function that wants to return an undefined value might indicate failure. Sometimes -1 is failure, sometimes 0 is failure, sometimes 0 is success; one has to look up the documentation to know exactly which. For a pointer, the undefined value is often pointer 0, the NULL pointer.
PHP Constants Checking if constant is definedTo check if constant is defined use the defined function. Note that this function doesn't care about constant's value, it only cares if the constant exists or not. Even if the value of the constant is null or false the function will still return true .
Yes, it can be relied upon. The C99 standard specifies at §6.10.1 ¶3:
After all replacements due to macro expansion and the defined unary operator have been performed, all remaining identifiers are replaced with the pp-number
0
Edit
Sorry, I thought it was a C question; still, no big deal, the equivalent section in the C++ standard (§16.1 ¶4) states:
After all replacements due to macro expansion and the defined unary operator have been performed, all remaining identifiers and keywords, except for
true
andfalse
, are replaced with the pp-number0
The only difference is the different handling of true
and false
, which in C do not need special handling, while in C++ they have a special meaning even in the preprocessing phase.
An identifier that is not defined as a macro is converted to 0
before the expression is evaluated.
The exception is the identifier true
, which is converted to 1
. This is specific to the C++ preprocessor; in C, this doesn't happen and you would need to include <stdbool.h>
to use true
this way, in which case it will be defined as a macro and no special handling is required.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With