c99内联语义与gcc(mspgcc)

我正在编写一些我希望内联的函数。

在这里阅读并使用第二个c99内联选项,内联所有声明和定义,如下所示:

extern inline void SPFD54124B_write_cmd(uint16_t command); 

在标题中,和

 inline void SPFD54124B_write_cmd(uint16_t command) { spi_write(command, CMD_WIDTH); } 

在相应的c文件中。 我期待获得function的内联版本。

但是当我编译我得到:

 Generating dependencies dep/spi.d from src/spi.c Generating dependencies dep/spfd54124b.d from src/spfd54124b.c Generating dependencies dep/pomodoro.d from src/pomodoro.c Generating dependencies dep/font8x8_ualnum.d from src/font8x8_ualnum.c Generating dependencies dep/font8x8_basic.d from src/font8x8_basic.c Generating dependencies dep/evading_util.d from src/evading_util.c Compiling src/evading_util.c Compiling src/font8x8_basic.c Compiling src/font8x8_ualnum.c Compiling src/pomodoro.c src/spfd54124b.h:96:20: warning: inline function 'SPFD54124B_write_pixel' declared but never defined [enabled by default] src/spfd54124b.h:95:20: warning: inline function 'SPFD54124B_write_param' declared but never defined [enabled by default] src/spfd54124b.h:94:20: warning: inline function 'SPFD54124B_write_cmd' declared but never defined [enabled by default] src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default] src/spfd54124b.h:96:20: warning: inline function 'SPFD54124B_write_pixel' declared but never defined [enabled by default] src/spfd54124b.h:95:20: warning: inline function 'SPFD54124B_write_param' declared but never defined [enabled by default] src/spfd54124b.h:94:20: warning: inline function 'SPFD54124B_write_cmd' declared but never defined [enabled by default] src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default] src/pomodoro.c: In function 'main': src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline] src/pomodoro.c:29:25: warning: called from here [-Winline] src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline] src/pomodoro.c:31:25: warning: called from here [-Winline] src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline] src/pomodoro.c:35:25: warning: called from here [-Winline] src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline] src/pomodoro.c:36:25: warning: called from here [-Winline] src/spfd54124b.h:96:20: warning: inlining failed in call to 'SPFD54124B_write_pixel': function body not available [-Winline] src/pomodoro.c:40:31: warning: called from here [-Winline] src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline] src/pomodoro.c:43:25: warning: called from here [-Winline] Compiling src/spfd54124b.c src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default] src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default] src/spfd54124b.c: In function 'SPFD54124B_init': src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:124:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:124:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spfd54124b.c: In function 'SPFD54124B_read': src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:25:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:29:14: warning: called from here [-Winline] src/spfd54124b.c: In function 'SPFD54124B_write_cmd': src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:124:14: warning: called from here [-Winline] src/spfd54124b.c: In function 'SPFD54124B_write_param': src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spfd54124b.c: In function 'SPFD54124B_write_pixel': src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spfd54124b.c: In function 'SPFD54124B_setrow': src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:124:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spfd54124b.c: In function 'SPFD54124B_setcol': src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:124:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spfd54124b.c: In function 'SPFD54124B_lputch': src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:124:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spfd54124b.c: In function 'SPFD54124B_putch': src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:124:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline] src/spfd54124b.c:129:14: warning: called from here [-Winline] Compiling src/spi.c Linking bin/pomodoro.elf >>>> Size of Firmware <<<< text data bss dec hex filename 3150 0 2 3152 c50 bin/pomodoro.elf src/spfd54124b.h:96:20: warning: inline function 'SPFD54124B_write_pixel' declared but never defined [enabled by default] src/spfd54124b.h:95:20: warning: inline function 'SPFD54124B_write_param' declared but never defined [enabled by default] src/spfd54124b.h:94:20: warning: inline function 'SPFD54124B_write_cmd' declared but never defined [enabled by default] src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default] src/spfd54124b.h:96:20: warning: inline function 'SPFD54124B_write_pixel' declared but never defined [enabled by default] src/spfd54124b.h:95:20: warning: inline function 'SPFD54124B_write_param' declared but never defined [enabled by default] src/spfd54124b.h:94:20: warning: inline function 'SPFD54124B_write_cmd' declared but never defined [enabled by default] src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default] src/pomodoro.c: In function 'main': src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline] src/pomodoro.c:29:25: warning: called from here [-Winline] src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline] src/pomodoro.c:31:25: warning: called from here [-Winline] src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline] src/pomodoro.c:35:25: warning: called from here [-Winline] src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline] src/pomodoro.c:36:25: warning: called from here [-Winline] src/spfd54124b.h:96:20: warning: inlining failed in call to 'SPFD54124B_write_pixel': function body not available [-Winline] src/pomodoro.c:40:31: warning: called from here [-Winline] src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline] src/pomodoro.c:43:25: warning: called from here [-Winline] 

我不确定我理解c99中不同的内联替代品。

从你需要的方式来看,你有完全错误的方法。 在标题中,您应该使用:

 inline void SPFD54124B_write_cmd(uint16_t command) { spi_write(command, CMD_WIDTH); } 

在包含此标头的翻译单元中,这将创建具有外部链接的内联函数。 在这些翻译单元中,您还应该放置声明:

 extern void SPFD54124B_write_cmd(uint16_t); 

这(与标题中的inline定义一起)将创建函数的外部定义 。 包含标题但不包含extern声明的其他文件将创建函数的内联定义 :仅在该转换单元中可用的定义,但不禁止其他地方的外部定义。

总的来说,您将拥有该函数的一个外部定义,并且包含标头的每个文件也将具有可用的非外部定义; 编译器可以使用其中之一。 从概念上讲,在完整的程序中仍然只有一个名为SPFD54124B_write_cmd函数 – 例如,如果您在多个翻译单元中获取函数的地址,则应该获得相同的值。

作为替代方案,您可以将其放在标题中:

 static inline void SPFD54124B_write_cmd(uint16_t command) { spi_write(command, CMD_WIDTH); } 

并且根本不使用extern声明; 这将创建一个内联函数,在每个包含标题的文件中都有内部链接。 根本没有函数的外部定义,概念上,包含头的每个翻译单元都有自己独立的函数副本。


(后人应该注意到GCC当前的默认模式是“gnu89”,它没有实现inline C99语义)

为了确保可以内联函数ACTUALLY,几乎必须在头文件中定义它。

当你不这样做时,大多数编译器实际上不会内联函数。

所以我的建议是将实际的函数内容移动到头文件中:

 inline void SPFD54124B_write_cmd(uint16_t command) { spi_write(command, CMD_WIDTH); }