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); }