Should functions be made “extern” in header files?

ε祈祈猫儿з 提交于 2019-11-28 15:46:45

问题


Should functions be made extern in header files? Or are they extern by default?

For example, should I write this:

// birthdays.h
struct person find_birthday(const char* name);

or this:

// birthdays.h
extern struct person find_birthday(const char* name);

回答1:


From The C Book:

If a declaration contains the extern storage class specifier, or is the declaration of a function with no storage class specifier (or both), then:

  • If there is already a visible declaration of that identifier with file scope, the resulting linkage is the same as that of the visible declaration;
  • otherwise the result is external linkage.

So if this is the only time it's declared in the translation unit, it will have external linkage.




回答2:


They are implicitly declared with "extern".




回答3:


Functions declared in headers are normally (unless you work really hard) extern. Personally, I prefer to see the explicit keyword there - but the compiler doesn't need it. It reminds the readers that they are extern, and since humans are more fallible than computers, I find the reminder helps.

With variables, it is important to use the extern keyword (and no initializer) in the header file. Consequently, for symmetry with the (very few) global variables declared in headers, I use extern with the function too - even though it is strictly not necessary.




回答4:


No, functions declared in header files do not need to be declared extern.

But variables defined in a .h header and then #included in multiple .c files will need to be declared extern.




回答5:


I never bother with the "extern" in my source code, but some people do. To my mind, having extern before variables but not functions makes it more visually obvious which things are functions and which things are variables (possibly including function pointers). I think a lot probably depends on how the declarations in the .h file are created, and how they relate to the main .c file. I usually start by typing in the .h file prototypes, and then copy/paste to the .c file and add the function body (striking the semicolon at the end of the prototype), so "extern" would require have to be added to the header file or struck from the main .c file after the copy/paste.



来源:https://stackoverflow.com/questions/3367124/should-functions-be-made-extern-in-header-files

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!