Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

inline function and class and header file

  1. Will any function defined in the header file automatically be inline?
  2. If I declare a function in a class and give the definition outside using keyword inline, will this function be inline? If it is, why this does not against the law that inline function should be given the body at declaration?
like image 538
Weizhou Sun Avatar asked Dec 08 '22 16:12

Weizhou Sun


2 Answers

Any function defined inside a class definition is inline. Any function marked inline is also inline.

class C {
    int f() { return 3; } // inline
    int g();
    int h();
}


inline int C::g() { return 4; } // inline
int C::h() { return 5; } // not inline

If all this code is in a header and that header is used in more than one translation unit you'll get a complaint that C::h has more than one definition. C::f and C::g are okay because they're inline. That's the primary role of inline these days: to permit defining the same function in multiple places (provided the definitions are "the same").

like image 164
Pete Becker Avatar answered Dec 11 '22 06:12

Pete Becker


is it that any function defined in the header file will automatically be inline?

No, you should make any function defined outside of class body inline by hands. Otherwise, most likely you would get ODR violation (if include header in several translation units).

ISO C++11

3.2 One definition rule

1: No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.

[...]

4: Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program; no diagnostic required. The definition can appear explicitly in the program, it can be found in the standard or a user-defined library, or (when appropriate) it is implicitly defined (see 12.1, 12.4 and 12.8). An inline function shall be defined in every translation unit in which it is odr-used.


if I declare a function in a class and give the definition outside using keyword inline, will this function be inline? If it is, why this does not against the law that inline function should be given the body at declaration?

There are several ways to do member function inline:

First, according to 7.1.2/3:

A function defined within a class definition is an inline function. The inline specifier shall not appear on a block scope function declaration.90 If the inline specifier is used in a friend declaration, that declaration shall be a definition or the function shall have previously been declared inline.

struct First
{
    void first(){}
};

Second, Third and Fourth, according to 9.3/3:

An inline member function (whether static or non-static) may also be defined outside of its class definition provided either its declaration in the class definition or its definition outside of the class definition declares the function as inline. [ Note: Member functions of a class in namespace scope have external linkage. Member functions of a local class (9.8) have no linkage. See 3.5. —end note ]

struct STF
{
    void second();
    inline void third();
    inline void fourth();
};

inline void STF::second(){}
void STF::third(){}
inline void STF::fourth(){}
like image 28
Evgeny Panasyuk Avatar answered Dec 11 '22 05:12

Evgeny Panasyuk