Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      inline specifier

      From cppreference.com
      <cpp‎ |language
       
       
      C++ language
      General topics
      Flow control
      Conditional execution statements
      Iteration statements (loops)
      Jump statements
      Functions
      Function declaration
      Lambda function expression
      inline specifier
      Dynamic exception specifications(until C++17*)
      noexcept specifier(C++11)
      Exceptions
      Namespaces
      Types
      Specifiers
      constexpr(C++11)
      consteval(C++20)
      constinit(C++20)
      Storage duration specifiers
      Initialization
      Expressions
      Alternative representations
      Literals
      Boolean -Integer -Floating-point
      Character -String -nullptr(C++11)
      User-defined(C++11)
      Utilities
      Attributes(C++11)
      Types
      typedef declaration
      Type alias declaration(C++11)
      Casts
      Memory allocation
      Classes
      Class-specific function properties
      Special member functions
      Templates
      Miscellaneous
       
      Declarations
       

      Theinline specifier, when used in a function'sdecl-specifier-seq, declares the function to be aninline function.

      A function defined entirely inside aclass/struct/union definition, whether it's a member function or a non-memberfriend function, is implicitly an inline function unless it is attached to anamed module(since C++20).

      A function declaredconstexpr orconsteval(since C++20) on its first declaration is implicitly an inline function.

      A deleted function is implicitly an inline function: its (deleted) definition can appear in more than one translation unit.

      (since C++11)

      Theinline specifier, when used in adecl-specifier-seq of a variable with static storage duration (static class member or namespace-scope variable), declares the variable to be aninline variable.

      A static data member declaredconstexpr on its first declaration is implicitly an inline variable.

      (since C++17)

      Contents

      [edit]Explanation

      An inline function or inline variable(since C++17) has the following properties:

      • The definition of an inline function or variable(since C++17) must be reachable in the translation unit where it is accessed (not necessarily before the point of access).
      • An inline function or variable(since C++17) withexternal linkage (e.g. not declaredstatic) has the following additional properties:
      • There may bemore than one definition of an inline function or variable(since C++17) in the program as long as each definition appears in a different translation unit and (for non-static inline functions and variables(since C++17)) all definitions are identical. For example, an inline function or an inline variable(since C++17) may be defined in a header file that is included in multiple source files.
      • It must be declaredinline in every translation unit.
      • It has the same address in every translation unit.

      In an inline function,

      • Function-local static objects in all function definitions are shared across all translation units (they all refer to the same object defined in one translation unit).
      • Types defined in all function definitions are also the same in all translation units.

      Inline const variables at namespace scope haveexternal linkage by default (unlike the non-inline non-volatile const-qualified variables).

      (since C++17)

      The original intent of theinline keyword was to serve as an indicator to the optimizer thatinline substitution of a function is preferred over function call, that is, instead of executing the function call CPU instruction to transfer control to the function body, a copy of the function body is executed without generating the call. This avoids overhead created by the function call (passing the arguments and retrieving the result) but it may result in a larger executable as the code for the function has to be repeated multiple times.

      Since inline substitution is unobservable in the standard semantics, compilers are free to use inline substitution for any function that's not markedinline, and are free to generate function calls to any function markedinline. Those optimization choices do not change the rules regarding multiple definitions and shared statics listed above.

      Because the meaning of the keywordinline for functions came to mean "multiple definitions are permitted" rather than "inlining is preferred" since C++98, that meaning was extended to variables.

      (since C++17)

      [edit]Notes

      If an inline function or variable(since C++17) with external linkage is defined differently in different translation units, the program is ill-formed, no diagnostic required.

      Theinline specifier cannot be used with a function or variable(since C++17) declaration at block scope (inside another function).

      Theinline specifier cannot re-declare a function or variable(since C++17) that was already defined in the translation unit as non-inline.

      The implicitly-generated member functions and any member function declared as defaulted on its first declaration are inline just like any other function defined inside a class definition.

      If an inline function is declared in different translation units, the accumulated sets ofdefault arguments must be the same at the end of each translation unit.

      In C, inline functions do not have to be declaredinline in every translation unit (at most one may be non-inline orexterninline), the function definitions do not have to be identical (but the behavior of the program is unspecified if it depends on which one is called), and the function-local statics are distinct between different definitions of the same function.

      Seestatic data members for additional rules about inline static members.

      Inline variables eliminate the main obstacle to packaging C++ code as header-only libraries.

      (since C++17)
      Feature-test macroValueStdFeature
      __cpp_inline_variables201606L(C++17)Inline variables

      [edit]Keywords

      inline

      [edit]Example

      Header "example.h":

      #ifndef EXAMPLE_H#define EXAMPLE_H #include <atomic> // function included in multiple source files must be inlineinlineint sum(int a,int b){return a+ b;} // variable with external linkage included in multiple source files must be inlineinlinestd::atomic<int> counter(0); #endif

      Source file #1:

      #include "example.h" int a(){++counter;return sum(1,2);}

      Source file #2:

      #include "example.h" int b(){++counter;return sum(3,4);}

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      CWG 281C++98a friend function declaration could use the inline specifier
      even if the friended function is not an inline function
      prohibit such uses
      CWG 317C++98a function could be declared inline even if it has a non-inline
      definition in the same translation unit before the declaration
      the program is ill-
      formed in this case
      CWG 765C++98a type defined in an inline function might
      be different in different translation units
      such types are the same
      in all translation units
      CWG 1823C++98string literals in all definitions of an inline
      function were shared across all translation units
      the requirement is removed due to
      consistency and implementations
      CWG 2531C++17a static data member could be implicitly inline even if
      it was not declaredconstexpr on its first declaration
      it is not implicitly
      inline in this case

      [edit]See also

      C documentation forinline
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/language/inline&oldid=175032"

      [8]ページ先頭

      ©2009-2025 Movatter.jp