VS2015 无法理解静态内联函数

VS2015 cannot fathom static inline functions

我在 visual studio makefile 项目的头文件中定义了以下函数,该项目最终使用 msys-rtemsc 中构建:

static inline UInt32 timer_now() {
    ...

其中类型 UInt32 是来自包含的头文件的 typedef

typedef unsigned long UInt32;

由于该功能,我的智能感知出现以下问题:

  1. Intellisense 建议 inline 不是类型名称。 >Error: Variable 'inline' is not a type name
  2. Intellisense 认为 UInt32 的定义是这个函数而不是 typedef unsigned long.
  3. 如果我删除 inline 关键字,一切正常(除了我不想这样做,因为这是我们想要内联的函数)。
  4. 我不认为这完全与我的 typedef UInt32 有关,因为如果我用 unsigned long 换掉它,我仍然会遇到同样的问题。
  5. 在这个使用 static inline double 的函数下面还有一堆其他函数,除非将它们移动到第一个函数,否则不会有任何错误。然后他们遇到同样的错误。

我尝试重启 VS2015 并删除 SQL 数据库文件。我玩过各种智能感知选项都无济于事。 这是智能感知错误吗?

作为附加说明,快速查看项目的其余部分会发现任何 h 文件中的第一个 inline 函数都存在此问题。

Visual studio 已打开错误 here

作为一个更简单的例子,我将头文件缩减为:

#ifndef SERVOSCHED_H 
#define SERVOSCHED_H

typedef unsigned long UInt32;
static inline UInt32 timer_now() {}

#endif

我仍然明白:

为什么我不想关闭智能感知。

这不仅仅是影响我的智能感知,否则我不会在意。真正的问题是它认为 UInt32 在这一行中 声明

static inline UInt32 timer_now() {

即。当我在任何 UInt32 上定义时,它会将我带到这一行。但更糟糕的是,由于这个 ANYTHING 声明为类型 UInt32 无法按定义找到。就好像我在庞大的代码库中的任何地方都有这个:

UInt32 ii;
...
for (ii = 0; ii < 10; ++ii) {

然后-

  1. VS 认为 ii 未定义。
  2. 您不能按照 ii 的定义 - 这太烦人了。

我们几乎无处不在地使用 UInt32Int32,并且无法轻易找到用这些类型声明的任何内容,这是一个大问题。

为什么我不想只更改 inline

我知道 static inline 关键字可能不会对此特定代码执行任何操作。不是我不想改变它。这是我无法改变它。此代码在 GCC 3.4.5 中编译为 c。该编译器是在 Power PC 5200 板 BSP 下为 RTEMS 编写的交叉编译器。当你只是删除内联时,你认为它会如何改变汇编代码?不知道?我也不知道。鉴于这是 运行 一个可以影响安全功能的实时系统。我不只是不想改变它。在我们决定也升级编译器之前,我无法更改它。

当前解决方法

为了暂时解决这个问题,我定义了以下 typedef:

typedef UInt32 inlineUInt32;

并在 static inline 函数定义中使用它代替 UInt32。这解决了 UInt32 所描述的问题,但我对 运行 代码(使用 makefile 构建)进行了更改以取悦 Visual Studio,这是 愚蠢的 .

从给出的示例中,很明显那里不需要 'inline',可以安全地删除。解释:

  1. 如果 timer_now() 在 class 内定义,则不需要内联,因为 class 内的定义始终是内联的。删除以减少混乱。
  2. timer_now() 不能是头文件中独立函数的定义,因为在这种情况下它不会被标记为 'static'
  3. 如果timer_now()是.cpp文件中的定义,则不需要内联,因为如果函数可以被编译器内联,它就会内联,不需要标记它内联。

这是处理 C 源文件(或 C 源文件包含的 headers)时 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

理想情况下,这个宏定义应该放在一个公共的 header 中,它包含在项目中的所有内容中。如果不存在这样的 header,那么您可以将它放在自己的 header 中,然后 force-include 使用 the /FI compiler option 将它放在每个文件的顶部。 (这通常是不可取的,但由于您只是将其用作此 IntelliSense 问题的临时解决方法,所以它可能没问题。)