Defect Report #144
Submission Date: 23 Feb 95
Submittor: BSI
Source: Clive D.W. Feather
Question
Submitted to BSI by Clive D.W. Feather clive@sco.com.
In this Defect Report, identifiers lexically identical to those
declared in standard headers refer to the identifiers declared in those
standard headers, whether or not the header is explicitly mentioned.
This Defect Report has been prepared with considerable help from
Mark Brader, Jutta Degener, Ronald Guilmette, and a person whose
employment conditions require anonymity. However, except where stated,
opinions expressed or implied should not be assumed to be those of any
person other than myself.
Defect Report UK 028: Preprocessing of preprocessing directives
Can the white space preceeding the initial # of
a preprocessing directive be derived from macro expansion? Consider the
following code extract:
#define EMPTY
# EMPTY include <file.h> /* Line A */
EMPTY # include <file.h> /* Line B */
Line A is clearly forbidden by subclause 6.8:
The preprocessing tokens within a preprocessing directive are not
subject to macro expansion unless otherwise stated.
However, this text does not appear to forbid line B. Nor does
subclause 6.8.3.4:
The resulting completely macro-replaced preprocessing token
sequence is not processed as a preprocessing directive even if it
resembles one. If that subclause applies only to the expansion of
EMPTY, it is not relevant. If it applies to both the
expansion and the following preprocessing token sequence, then no
subsequent preprocessing directive could ever be processed.
Is line B strictly conforming, or does it violate a constraint
(and if so, which), or does it cause undefined behavior?
Suggested Technical Corrigendum:
In subclause 6.8 Description, change:
A preprocessing directive consists of a sequence of preprocessing
tokens that begins with a # preprocessing token that is either ...
to:
A preprocessing directive consists of a sequence of preprocessing
tokens that begins with a # preprocessing token that (at the start of
translation phase 4, before any preprocessing takes place) is either
...
Suggested Future Change
The current C Standard has correct meaning, but the wording could
be clearer. We suggest the following change for the revised C Standard:
A preprocessing directive consists of a directive consists of a
sequence of preprocessing tokens that begins with a #
preprocessing token that (at the start of translation phase 4) is
either ...
Previous Defect Report
< - >
Next Defect Report