inline的C99标准相关原文
WG14/N1256 Annex J (informative) Portability issues
J.1 Unspecified behavior
Whether a call to an inline function uses the inline definition
or the external definition
of the function (6.7.4).
J.2 Undefined behavior
A function with external linkage
is declared with an inline function specifier, but is not also defined in the same translation unit (6.7.4).
J.3 Implementation-defined behavior - J.3.8 Hints
The extent to which suggestions made by using the inline function specifier are effective (6.7.4).
WG14/N1256 6.7.4 Function specifiers
Syntax
function-specifier:
inline
Constraints
Function specifiers shall be used only in the declaration of an identifier for a function.
An inline definition
of a function with external linkage
shall not contain a definition of a modifiable object with static storage duration, and shall not contain a reference to an identifier with internal linkage
.
In a hosted environment, the inline function specifier shall not appear in a declaration of main.
Semantics
A function declared with an inline function specifier is an inline function. The function specifier may appear more than once; the behavior is the same as if it appeared only once. Making a function an inline function suggests that calls to the function be as fast as possible.120) The extent to which such suggestions are effective is implementation-defined.121)
Any function with internal linkage
can be an inline function. For a function with external linkage
, the following restrictions apply: If a function is declared with an inline function specifier, then it shall also be defined in the same translation unit. If all of the file scope declarations for a function in a translation unit include the inline function specifier without extern, then the definition in that translation unit is an inline definition
. An inline definition
does not provide an external definition
for the function, and does not forbid an external definition
in another translation unit. An inline definition
provides an alternative to an external definition
, which a translator may use to implement any call to the function in the same translation unit. It is unspecified whether a call to the function uses the inline definition
or the external definition
.122)
EXAMPLE
The declaration of an inline function with external linkage
can result in either an external definition
, or a definition available for use only within the translation unit. A file scope declaration with extern creates an external definition
. The following example shows an entire translation unit.
inline double fahr(double t)
{
return (9.0 * t) / 5.0 + 32.0;
}
inline double cels(double t)
{
return (5.0 * (t - 32.0)) / 9.0;
}
extern double fahr(double); // creates an `external definition`
double convert(int is_fahr, double temp)
{
/* A translator may perform inline substitutions */
return is_fahr ? cels(temp) : fahr(temp);
}
Note that the definition of fahr is an external definition
because fahr is also declared with extern, but the definition of cels is an inline definition
. Because cels has external linkage
and is referenced, an external definition
has to appear in another translation unit (see 6.9); the inline definition
and the external definition
are distinct and either may be used for the call.
Forward references: function definitions (6.9.1).
- By using, for example, an alternative to the usual function call mechanism, such as ‘‘inline substitution’’. Inline substitution is not textual substitution, nor does it create a new function. Therefore, for example, the expansion of a macro used within the body of the function uses the definition it had at the point the function body appears, and not where the function is called; and identifiers refer to the declarations in scope where the body occurs. Likewise, the function has a single address, regardless of the number of
inline definitions
that occur in addition to theexternal definition
. - For example, an implementation might never perform inline substitution, or might only perform inline substitutions to calls in the scope of an inline declaration.
- Since an
inline definition
is distinct from the correspondingexternal definition
and from any other correspondinginline definitions
in other translation units, all corresponding objects with static storage duration are also distinct in each of the definitions.
6.9 External definitions
Syntax
translation-unit:
external-declaration
translation-unit external-declaration
external-declaration:
function-definition
declaration
Constraints
The storage-class specifiers auto and register shall not appear in the declaration specifiers in an external declaration.
There shall be no more than one external definition
for each identifier declared with internal linkage
in a translation unit. Moreover, if an identifier declared with internal linkage
is used in an expression (other than as a part of the operand of a sizeof operator whose result is an integer constant), there shall be exactly one external definition
for the identifier in the translation unit.
Semantics
As discussed in 5.1.1.1, the unit of program text after preprocessing is a translation unit, which consists of a sequence of external declarations. These are described as ‘‘external’’ because they appear outside any function (and hence have file scope). As discussed in 6.7, a declaration that also causes storage to be reserved for an object or a function named by the identifier is a definition.
An external definition
is an external declaration that is also a definition of a function (other than an inline definition
) or an object. If an identifier declared with external linkage
is used in an expression (other than as part of the operand of a sizeof operator whose result is an integer constant), somewhere in the entire program there shall be exactly one external definition
for the identifier; otherwise, there shall be no more than one.140)
- Thus, if an identifier declared with
external linkage
is not used in an expression, there need be noexternal definition
for it.
其他function specifiers
J.5 Common extensions
The following extensions are widely used in many systems, but are not portable to all implementations. The inclusion of any extension that may cause a strictly conforming program to become invalid renders an implementation nonconforming. Examples of such extensions are new keywords, extra library functions declared in standard headers, or predefined macros with names that do not begin with an underscore.
J.5.9 The fortran keyword
The fortran function specifier may be used in a function declaration to indicate that calls suitable for FORTRAN should be generated, or that a different representation for the external name is to be generated (6.7.4).