These error messages come from the pre-processing pass of the compiler. Athough the compiler and pre-processor are integrated into the same executable, it is worth distinguishing the pre-processor error messages from those generated by the compiler proper.

## # is not followed by a macro parameter

The `#` concatenation operator must be followed by a macro parameter name.

## ## occurs at border of replacement

The `##` operator cannot be placed at the end of a line.

## #defined token is not a name

The token defined immediately after `#define` is not a valid pre-processor identifier.

## #defined token 'token' can't be redefined

You cannot redefine a number of standard tokens such as `__LINE__` and `__STDC__`. The token you're trying to redefine is one of these.

## bad ?: in #if/#elif

There is an error parsing the ternary `?:` operator in an expression. This is usually caused by mismatched parentheses or forgetting one of the `?` or `:` separators.

## bad operator 'operator' in #if/#elif

The operator operator is not allowed in pre-processor expressions.

## bad syntax for 'defined'

The `defined` standard pre-processor function does not conform to the syntax `defined(` name `)`.

## can't find include file 'file'

The include file file can't be found in any of the directories specified in compilation.

## disagreement in number of macro arguments to 'name'

The macro name has been invoked with either too few or too many actual arguments according to its formal argument list.

## duplicate macro argument 'name'

The macro argument name has been given twice in the argument list of a `#define` pre-processor control.

## end of file in macro argument list

The pre-processor encountered the end of file whilst processing the argument list of a macro.

## illegal operator * or & in #if/#elif

The pointer dereference operator `*` and the address-of operator `&` cannot be used in pre-processor expressions.

## insufficient memory

The pre-processor has run out of memory. This is a very unlikely error message, but if it does occur you should split up the file you are trying to compile into several smaller files.

## macro redefinition of 'name'

The macro name has been defined twice with two different definitions. This usually occurs when two header files are included into a C source file and macros in the header files clash.

## pre-processor internal error: cause

The pre-processor has found an internal inconsistency in its data structures. It would help us if you could submit a bug report and supporting files which demonstrate the error.

## stringified macro argument is too long

The stringified macro argument is longer than 512 characters. This error is unlikely to occur in user code and it isn't practical to show an example of this failure here.

## syntax error in #ifdef/#ifndef

The pre-processor found an error when processing the `#ifdef` or `#ifndef` controls. This is usually caused by extra tokens on the pre-processor control line.

## syntax error in #include

The pre-processor found an error when processing the file to include in an `#include` directive. The usual cause of this is that the file name isn't enclosed in angle brackets or quotation marks, or that the trailing quotation mark is missing.

## syntax error in macro parameters

The syntax of the comma-separated list of macro parameters in a `#define` pre-processor control is not correct. This can occur for a number of reasons, but most common is incorrect puctuation.

## undefined expression value

The pre-processor encountered an error when evaluating an expression which caused the expression to be undefined. This is caused by dividing by zero using the division or modulus operators.

## unterminated string or character constant

A string is not terminated at the end of a line.