所以我的标题看起来像这样:
#include "compiler.h"
INLINE FUNC(boolean, DIAG_APPL_CODE) Cdd_IsXcpActive(void){
return (boolean)(Cdd_Dcm_NvM_Coding_Adaption_Block[CODING_ADAPTION_XCP_ACTIVATION_OFFSET] == 1);
}
在compiler.h中
#define INLINE inline
#define FUNC(x, y) x
typedef unsigned char boolean;
已定义
尝试编译时,我会使用-E
inline boolean Cdd_IsXcpActive(void){
return (boolean)(Cdd_Dcm_NvM_Coding_Adaption_Block[0 +1U] == 1);
}
表示正在对所有内容进行正确的预处理。
仍然抱怨抱怨:
clang --analyze -Weverything -Wextra -std=c89 -c -g3 -O -D_lint -I . -I AID -I CDD -I COM -I config -I DIA -I MC -I MCAL -I OS -I RTE CDD/Cdd_Diag.c -o CDD/bin_ninja/Cdd_Diag.o
In file included from CDD/Cdd_Diag.c:5:
CDD/Cdd_Diag.h:32:1: error: unknown type name 'inline'
INLINE FUNC(boolean, DIAG_APPL_CODE) Cdd_IsXcpActive(void){
^
AID/Compiler.h:233:17: note: expanded from macro 'INLINE'
#define INLINE inline
^
In file included from CDD/Cdd_Diag.c:5:
CDD/Cdd_Diag.h:32:37: error: expected ';' after top level declarator
INLINE FUNC(boolean, DIAG_APPL_CODE) Cdd_IsXcpActive(void){
^
;
clang版
clang version 3.4.2 (tags/RELEASE_34/dot2-final)
Target: i386-pc-cygwin
Thread model: posix
有人知道这里会发生什么吗?
答案 0 :(得分:1)
在C99中添加了inline
关键字,因此Clang将其视为具有-std=c89
的类型名称。
您可以使用-std=gnu89
标志代替支持-std=c89
的{{1}}。但请注意,它的实现略有不同。来自the Clang documentation:
inline
模式默认为C99中指定的实现*99
,而inline
模式实现GNU版本。对于具有*89
属性的单个函数,可以覆盖此项。
__gnu_inline__
此属性应与一个也使用
gnu_inline
关键字声明的函数一起使用。即使在C99或inline
模式下进行编译,它也会指示GCC将该功能视为在gnu90
模式下定义的功能。
如果函数声明为gnu99
,则该函数的定义仅用于内联。在任何情况下,函数都不会编译为独立函数,即使您明确地使用其地址也是如此。这样的地址成为外部引用,就像您只声明了该函数一样,并且没有定义它。这几乎具有宏的效果。使用它的方法是将函数定义放在带有此属性的头文件中,并将函数的另一个副本(不带extern
)放入库文件中。头文件中的定义导致对函数的大多数调用都被内联。如果函数的任何使用仍然存在,则它们引用库中的单个副本。请注意,函数的两个定义不必完全相同,但如果它们没有相同的效果,则程序可能会表现得很奇怪。在C中,如果函数既不是
extern
也不是extern
,那么函数将被编译为独立函数,并且尽可能内联。这就是GCC传统上处理声明为
static
的函数的方式。由于ISO C99为inline
指定了不同的语义,因此该函数属性作为转换度量提供,并且本身作为一个有用的特性。此属性在GCC 4.1.3及更高版本中可用。如果定义了预处理器宏inline
或__GNUC_GNU_INLINE__
,则可以使用它。请参阅An Inline Function is As Fast As a Macro。