0
votes

As specified in the Standard

If the declaration of an identifier for a function has no storage-class specifier, its linkage is determined exactly as if it were declared with the storage-class specifier extern.

But function specifier part gives inline function semantic as follows:

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.

Case 1.

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

inline void test(void); //does it provide an external definition?

Case 2.

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

extern inline void test(void); //does it provide an external definition?

Case 3.

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

void test(void); //does it provide an external definition?

I have a confusion regarding the three cases. Are there differences between them? I currently think about them as

Case 1 -- does not provide an external definition (inline without extern)

Case 2 -- provides external definition (inline with extern)

Case 3 -- provides external definition (same as with extern)

1

1 Answers

2
votes

static and extern cannot go together.

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

inline void test(void); //does it provide an external definition?

should actually be

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

static inline void test(void); //does it provide an external definition?

because the definition and the declaration should match. I am not sure though that static actually needs to be used when also using inline.


Case 2 -- provides external definition (inline with extern)

Case 3 -- provides external definition (same as with extern)

these actually conflict (if I understand correctly) with:

Any function with internal linkage can be an inline function.

extern is exactly about external linkage, as opposed to internal.