#define
Preprocessing Directive: Symbolic ConstantsThe #define
preprocessing directive creates symbolic constants—constants represented as symbols—and macros—operations defined as symbols. The #define
preprocessing directive format is
#define identifier replacement-text
When this line appears in a file, all subsequent occurrences (except those inside a string) of identifier in that file will be replaced by replacement-text before the program is compiled. For example,
#define PI 3.14159
replaces all subsequent occurrences of the symbolic constant PI
with the numeric constant 3.14159
. Symbolic constants enable you to create a name for a constant and use the name throughout the program. Later, if the constant needs to be modified throughout the program, it can be modified once in the #define
preprocessing directive—and when the program is recompiled, all occurrences of the constant in the program will be modified. [Note: Everything to the right of the symbolic constant name replaces the symbolic constant. For example, #define PI = 3.14159
causes the preprocessor to replace every occurrence of PI
with = 3.14159
. Such replacement is the cause of many subtle logic and syntax errors.] Redefining a symbolic constant with a new value without first undefining it is also an error. Note that const
variables in C++ are preferred over symbolic constants. Constant variables have a specific data type and are visible by name to a debugger. Once a symbolic constant is replaced with its replacement text, only the replacement text is visible to a debugger. A disadvantage of const
variables is that they might require a memory location of their data type size—symbolic constants do not require any additional memory.
Using symbolic constants in a file other than the file in which the symbolic constants are defined is a compilation error (unless they are #included
from a header file).
Using meaningful names for symbolic constants makes programs more self-documenting.