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).

  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 the external definition.
  2. For example, an implementation might never perform inline substitution, or might only perform inline substitutions to calls in the scope of an inline declaration.
  3. Since an inline definition is distinct from the corresponding external definition and from any other corresponding inline 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)

  1. Thus, if an identifier declared with external linkage is not used in an expression, there need be no external 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).

还有C11的 _Noreturn

原文地址:https://www.cnblogs.com/tjua/p/7704777.html