我在visual studio makefile项目的头文件中定义了以下函数,最终使用c
在msys-rtems
中构建:
static inline UInt32 timer_now() {
...
类型UInt32
是包含的头文件中的typedef
:
typedef unsigned long UInt32;
由于该功能,我的intellisense出现以下问题:
inline
不是类型名称。 >Error: Variable 'inline' is not a type name
UInt32
的定义是此函数而不是typedef unsigned long
。inline
关键字一切正常(除了我不想要,因为这是我们想要内联的函数)。typedef UInt32
有关,因为如果我将其与unsigned long
交换,我仍会遇到同样的问题。 static inline double
下面还有许多其他函数没有任何错误。然后他们会遇到同样的错误。 我尝试重启VS2015并删除SQL
数据库文件。我玩过各种intellisense选项无济于事。 这是一个intellisense错误吗?
作为补充说明,快速查看项目的其余部分会使其看起来像任何h文件中的第一个inline
函数都有此问题。
Visual studio bug打开here。
作为一个更小的例子,我将头文件缩减为:
#ifndef SERVOSCHED_H
#define SERVOSCHED_H
typedef unsigned long UInt32;
static inline UInt32 timer_now() {}
#endif
我仍然明白这一点:
这不仅影响我的智力,否则我不在乎。真正的问题是,它认为此行中UInt32
已声明:
static inline UInt32 timer_now() {
即。当我在任何UInt32
使用时进行定义时,它会将我带到这一行。但更糟糕的是,因为声明为类型UInt32
的 ANYTHING 无法按定义找到。就像我在我们庞大的代码库中的任何地方一样:
UInt32 ii;
...
for (ii = 0; ii < 10; ++ii) {
然后 -
ii
未定义。ii
的定义 - 这很疯狂。 我们在任何地方都使用UInt32
和Int32
,使用这些类型声明的任何内容都不容易找到,这是一个很大的问题。
inline
我知道static inline
关键字可能对此特定代码无效。它不是我不想改变它。这是我无法改变它。该代码在GCC 3.4.5中编译为c。编译器是在Power PC 5200板BSP下为RTEMS编写的交叉编译器。当你删除内联时,你认为它会如何改变汇编代码?不知道?我也没有。鉴于这是运行可影响安全功能的实时系统。我不只是想改变它。我不能改变它,直到我们决定升级编译器为止。
为了解决这个问题,我现在定义了以下typedef
:
typedef UInt32 inlineUInt32;
并在UInt32
函数定义中使用了此代替static inline
。这解决了UInt32
所描述的问题,但是我已经对运行代码(使用makefile构建)进行了更改,以取悦Visual Studio 愚蠢。
答案 0 :(得分:8)
这是处理C源文件(或C源文件包含的标头)时Visual C ++ IntelliSense服务中的错误。几个月前在Microsoft Connect上报告了这个错误:IntelliSense does not accept "inline" C99 functions。该错误已得到修复,修复程序将出现在Visual Studio 2015的下一次更新中。
解决方法(当您等待Visual Studio 2015的下一次更新时)将定义一个名为inline
的宏,该宏扩展为空,并保护该宏,以便仅在Visual C ++ IntelliSense时定义它服务正在解析文件。
#if defined _MSC_VER && defined __EDG__ && !defined __cplusplus
#define inline
#endif
理想情况下,此宏定义将放置在项目中所有内容包含的一个公共标头中。如果不存在此类标头,则可以将其置于其自己的标头中,然后使用the /FI
compiler option强制将其包含在每个文件的顶部。 (这通常是不可取的,但由于您只是将此作为此IntelliSense问题的临时解决方法,因此可能没问题。)
答案 1 :(得分:-4)
从给出的示例中可以清楚地看出,那里不需要“内联”,可以安全地删除。 Expalanation: