我正在写几个我想要内联的函数。
读取here并在所有声明和定义上使用第二个内联选项c99,如下所示:
extern inline void SPFD54124B_write_cmd(uint16_t command);在标头中,以及
inline void SPFD54124B_write_cmd(uint16_t command)
{
spi_write(command, CMD_WIDTH);
}在相应的c文件中。我希望得到函数的内联版本。
但是当我编译时,我得到:
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中不同的内联替代方案。
发布于 2013-06-24 08:16:13
你得到的东西与你需要的方式完全不同。在标题中,您应该使用:
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语义)
发布于 2013-06-24 07:35:17
为了确保一个函数实际上可以被内联,它几乎必须在头文件中定义。
如果不这样做,大多数编译器实际上不会内联函数。
因此,我的建议是将实际的函数内容移到头文件中:
inline void SPFD54124B_write_cmd(uint16_t command)
{
spi_write(command, CMD_WIDTH);
}https://stackoverflow.com/questions/17266073
复制相似问题