Distinguish "preprocessing operator" from "operator" tout court.
This commit is contained in:
parent
c65c03ca79
commit
b29f2c8bd3
41
cpp.texi
41
cpp.texi
|
@ -68,6 +68,13 @@ or warnings.
|
|||
Except for expansion of predefined macros, all these operations happen
|
||||
only if you use preprocessing directives to request them.
|
||||
|
||||
@cindex preprocessing operators
|
||||
Preprocessing does not recognize the operators of the C language
|
||||
itself, outside of the operand of the @code{#if} directive
|
||||
(@pxref{if}). However, it supports three @dfn{preprocessing
|
||||
operators} of its own: @code{#} (@pxref{Stringification}), @code{##}
|
||||
(@pxref{Concatenation}) and @code{defined} (@pxref{if}).
|
||||
|
||||
@node Directives
|
||||
@section Directives
|
||||
@cindex directives
|
||||
|
@ -157,7 +164,7 @@ The distinction between lexically valid and invalid floating-point
|
|||
numbers, for example, doesn't matter at this stage. The use of
|
||||
preprocessing numbers makes it possible to split an identifier at any
|
||||
position and get exactly two tokens, and reliably paste them together
|
||||
using the @code{##} operator (@pxref{Concatenation}).
|
||||
using the @code{##} preprocessing operator (@pxref{Concatenation}).
|
||||
|
||||
@item punctuator
|
||||
A @dfn{punctuator} is syntactically like an operator.
|
||||
|
@ -589,7 +596,7 @@ keywords. This can be useful if you wish to hide a keyword such as
|
|||
However, the preprocessing operator @code{defined} (@pxref{defined})
|
||||
can never be defined as a macro.
|
||||
|
||||
The operator @code{#} is used in macros for stringification of an
|
||||
The preprocessing operator @code{#} is used in macros for stringification of an
|
||||
argument (@pxref{Stringification}), and @code{##} is used for
|
||||
concatenation of arguments into larger tokens (@pxref{Concatenation})
|
||||
|
||||
|
@ -938,7 +945,7 @@ foo()def @expansion{} abc def
|
|||
@node Stringification
|
||||
@subsection Stringification
|
||||
@cindex stringification
|
||||
@cindex @code{#} operator
|
||||
@cindex @code{#} preprocessing operator
|
||||
|
||||
Sometimes you may want to convert a macro argument into a string
|
||||
constant. Parameters are not replaced inside string constants, but
|
||||
|
@ -1028,7 +1035,7 @@ macro-expanded.
|
|||
@cindex concatenation
|
||||
@cindex token pasting
|
||||
@cindex token concatenation
|
||||
@cindex @code{##} operator
|
||||
@cindex @code{##} preprocessing operator
|
||||
|
||||
It is often useful to merge two tokens into one while expanding macros.
|
||||
This is called @dfn{token pasting} or @dfn{token concatenation}. The
|
||||
|
@ -1071,7 +1078,7 @@ concatenated.
|
|||
It is an error to use @code{##} at the beginning or end of a macro
|
||||
body.
|
||||
|
||||
Multiple @code{##} operators are handled left-to-right, so that
|
||||
Multiple @code{##} preprocessing operators are handled left-to-right, so that
|
||||
@samp{1 ## e ## -2} pastes into @samp{1e-2}. (Right-to-left
|
||||
processing would first generate @samp{e-2}, which is an invalid token.)
|
||||
When @code{#} and @code{##} are used together, they are all handled
|
||||
|
@ -1144,11 +1151,12 @@ eprintf ("%s:%d: ", input_file, lineno)
|
|||
@expansion{} fprintf (stderr, "%s:%d: ", input_file, lineno)
|
||||
@end example
|
||||
|
||||
The variable argument is completely macro-expanded before it is inserted
|
||||
into the macro expansion, just like an ordinary argument. You may use
|
||||
the @code{#} and @code{##} operators to stringify the variable argument
|
||||
or to paste its leading or trailing token with another token. (But see
|
||||
below for an important special case for @code{##}.)
|
||||
The variable argument is completely macro-expanded before it is
|
||||
inserted into the macro expansion, just like an ordinary argument.
|
||||
You may use the @code{#} and @code{##} preprocessing operators to
|
||||
stringify the variable argument or to paste its leading or trailing
|
||||
token with another token. (But see below for an important special
|
||||
case for @code{##}.)
|
||||
|
||||
@strong{Warning:} don't use the identifier @code{@w{__VA_ARGS__}}
|
||||
for anything other than this.
|
||||
|
@ -1350,8 +1358,9 @@ The rest of the predefined macros are GNU C extensions.
|
|||
@item __COUNTER__
|
||||
This macro expands to sequential integral values starting from 0. In
|
||||
other words, each time the program uses this macro, it generates the
|
||||
next successive integer. This, with the @code{##} operator, provides
|
||||
a convenient means for macros to generate unique identifiers.
|
||||
next successive integer. This, with the @code{##} preprocessing
|
||||
operator, provides a convenient means for macros to generate unique
|
||||
identifiers.
|
||||
|
||||
@item __GNUC__
|
||||
@itemx __GNUC_MINOR__
|
||||
|
@ -2042,7 +2051,7 @@ A @dfn{conditional} is a preprocessing directive that controls whether
|
|||
or not to include a chunk of code in the final token stream that is
|
||||
compiled. Preprocessing conditionals can test arithmetic expressions,
|
||||
or whether a name is defined as a macro, or both together using the
|
||||
special @code{defined} operator.
|
||||
special @code{defined} preprocessing operator.
|
||||
|
||||
A preprocessing conditional in C resembles in some ways an @code{if}
|
||||
statement in C, but it is important to understand the difference between
|
||||
|
@ -2242,8 +2251,8 @@ Macros. All macros in the expression are expanded before actual
|
|||
computation of the expression's value begins.
|
||||
|
||||
@item
|
||||
Uses of the @code{defined} operator, which lets you check whether macros
|
||||
are defined in the middle of an @code{#if}.
|
||||
Uses of the @code{defined} preprocessing operator, which lets you
|
||||
check whether macros are defined in the middle of an @code{#if}.
|
||||
|
||||
@item
|
||||
Identifiers that are not macros, which are all considered to be the
|
||||
|
@ -2276,7 +2285,7 @@ value comes out to be nonzero, the @code{#if} succeeds and the
|
|||
@subsubsection The @code{defined} test
|
||||
|
||||
@cindex @code{defined}
|
||||
The special operator @code{defined} is used in @code{#if} and
|
||||
The preprocessing operator @code{defined} is used in @code{#if} and
|
||||
@code{#elif} expressions to test whether a certain name is defined as a
|
||||
macro. @code{defined @var{name}} and @code{defined (@var{name})} are
|
||||
both expressions whose value is 1 if @var{name} is defined as a macro at
|
||||
|
|
Loading…
Reference in New Issue