In C, should inline functions in headers be externed in the .c file?
Asked Answered
O

2

2

I've seen a few questions addressing this general topic, but I'm still unsure exactly what the correct approach is for ISO C, and how that may or may not vary from GNU C.

If I have some function inline void foo() in file.h defined with the inline keyword, should I also declare that function in file.c as extern void foo();? Assume that multiple .c files will include file.h.

From what I've read the answer seems to be "yes" and have something to do with how the compiler looks for definitions emitted by other translation units, but to be honest I don't fully understand the implications.

I'm working on a project right now that has a lot of functions declared inline within the header files, and none of those functions are declared in the corresponding .c files. Everything compiles without gcc complaining, but is this approach actually correct?

Olives answered 19/6, 2020 at 17:8 Comment(4)
in file.h defined should I also declare Are you mixing terms "function definition" and "function declaration"? but is this approach actually correct? are those function defined or declared? Are they static?Stenograph
Please see the related question Inline functions and external linkage.Tijuana
My understanding is that we need a declaration in the .c file to force emission of the function symbol in at least one TU. Without this no symbol for the function will ever be emitted.Olives
Is "inline" without "static" or "extern" ever useful in C99? also shows the actual syntax necessary in the .h and the extern inline declaration in exactly one .c to make a working C program with a non-static inline function defined in a header and thus able to actually inline.Venesection
L
4

Yes, if you use inline without static, there needs to be an actual external definition of the function somewhere in case the compiler declines to inline it in one or more places. The canonical way to do that is to make a source file containining (using your example names) nothing but:

#include "file.h"
extern void foo();

Personally, I find extern inline semantics in C confusing and messy, and prefer to avoid them entirely by making all inline functions static. Of course this wastes space with multiple instantiations of the function if the compiler declines to inline, but you should not be doing this with functions of nontrivial size anyway.

Looksee answered 19/6, 2020 at 17:58 Comment(8)
Thanks! Aside from potentially wasting space if the compiler doesn't inline, does using static also have the side effect of making making it impossible to compare function pointers to the function from different translation units?Olives
@Evan: Yes, it makes the function pointers non-equal because they're different functions.Looksee
if you inline a function (I mean, if the compiler inlines it) you waste space anyway, because you have a copy of the function code at every call point.Exactly
@Luis: The function body is just a function call, which you already have if the function is out-of-line.Looksee
@R..GitHubSTOPHELPINGICE, but the compiler can optimize it to avoid the unused paths, the body is not the same, as you don't use a new stack frame, so you avoid the preamble and postamble of the function as such. Inline code is good for simple functions on which the time spent in building a stack frame and entering and returning code is significant in the timing of the call.Exactly
@Luis: we are talking about a particular function in OP's question. Not a broader topic.Looksee
An inline function called foo() ??? actually? Is that a concrete function and you are not talking genericly? My apologies then, I misunderstood clearly the intention when I saw foo()'s name.Exactly
@LuisColorado: Sorry, I thought this comment thread was on a different but similar question. Nonetheless, whether to make the function inline is not the question here. The question is just how to do it correctly. So I don't think our discussion is on-topic.Looksee
V
-1

inline means the compiler will expand that function where it is used in the code (instead of calling it as a function). That means that an inline definition in a header file with the function implementation in a .c file makes no sense, as wherever you include the header in another .c file the function can't be expanded inline as its code implementation is not known.

So you should keep the inline function and its code implementation in the header file.

Volkman answered 19/6, 2020 at 17:45 Comment(3)
I think you misunderstood the question.Looksee
This is C, not C++. Inline functions must be implemented in a .c file as well as in the header.Aksum
@HolyBlackCat: C doesn't require a separate body for the extern implementation, though. Just a declaration using the extern keyword explicitly makes one automatically based on the inline definition.Looksee

© 2022 - 2024 — McMap. All rights reserved.