Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 头文件中的内联与静态内联_C_Static_Inline Functions - Fatal编程技术网

C 头文件中的内联与静态内联

C 头文件中的内联与静态内联,c,static,inline-functions,C,Static,Inline Functions,要在C头文件中为应内联到多个其他单元的函数放置inline函数定义,是否应使用inline或static inline?我在谷歌上搜索了一段时间,但到目前为止,似乎还没有简明的解释来解释这种差异。在C中内联函数的正确方法如下: 在标题中放置内联函数 创建包含该标头的实现文件 在实现文件中放置一个extern inline函数 例h inline int example(int val) { return (val << 2) | 1; } 你不能在头中声明一个静态内联,

要在C头文件中为应内联到多个其他单元的函数放置
inline
函数定义,是否应使用
inline
static inline
?我在谷歌上搜索了一段时间,但到目前为止,似乎还没有简明的解释来解释这种差异。

在C中内联函数的正确方法如下:

  • 在标题中放置
    内联
    函数
  • 创建包含该标头的实现文件
  • 在实现文件中放置一个
    extern inline
    函数
例h

inline int example(int val) {
    return (val << 2) | 1;
}
你不能在头中声明一个
静态内联
,而不使用.c吗

这将导致在包含标题的每个翻译单元中分别定义独立的函数。除了不必要地增加编译代码的大小之外,当您获得指向内联函数的指针时,这还会产生一些意外行为:不同转换单元中的内联函数地址将产生不同的值,而不是产生相同的地址

但是,如果有人保护头文件,就可以避免重新定义,不是吗


不,绝对不是。这与同一标题的多个包含内容无关。每个翻译单元都是独立于其他翻译单元进行编译的,因此当编译器看到一个静态函数时,它别无选择,只能创建一个从翻译单元外部看不见的私有副本。

难道不能声明一个静态内联函数吗。。。在标题中,没有.c?@self。因为这将导致在包含头文件的每个编译单元中重新定义函数,因此比较理论上相同函数的函数指针将产生意外结果。@dasblinkenlight但如果保护头文件,则可以避免重新定义,不能吗?@PeterVaro不。它与同一个标题的多个内含物无关-这些绝对是好的。每个翻译单元都是独立于其他翻译单元编译的,因此当编译器看到一个静态函数时,它别无选择,只能创建一个从翻译单元外部看不见的私有副本。@Toby只需要一个
外部内联
-在与.h文件匹配的.c文件中。另请参见
#include "example.h"

extern inline int example(int val);