clang在预处理器扩展后无法识别内联属性

时间:2014-08-29 14:32:08

标签: c clang c-preprocessor

所以我的标题看起来像这样:

#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

有人知道这里会发生什么吗?

1 个答案:

答案 0 :(得分:1)

在C99中添加了inline关键字,因此Clang将其视为具有-std=c89的类型名称。

您可以使用-std=gnu89标志代替支持-std=c89的{​​{1}}。但请注意,它的实现略有不同。来自the Clang documentation

  

inline模式默认为C99中指定的实现*99,而inline模式实现GNU版本。对于具有*89属性的单个函数,可以覆盖此项。

来自the GCC documentation

  
      
  • __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