c++ - VS2015 无法理解静态内联函数

标签 c++ c visual-studio intellisense

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

static inline UInt32 timer_now() {
    ...

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

typedef unsigned long UInt32;

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

  1. Intellisense 建议 inline 不是类型名称。 >错误:变量“inline”不是类型名称
  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

我仍然明白:

enter image description here

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

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

static inline UInt32 timer_now() {

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

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。

最佳答案

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

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

关于c++ - VS2015 无法理解静态内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851292/

相关文章:

c - ELF32 静态链接 (PPC 32 ABI)

visual-studio - Visual Studio 2008 解决方案中的最佳项目数是多少?

c++ - 使用MSBuild和Visual Studio 2012+预处理C++文件

c++ - 通过 SWIG 从 Python 访问 UtcTimeStamp

java - 如何开发使用 Android 源代码中的 C 文件的应用程序

c++ - 游戏文件存档格式

C循环展开优化性能

visual-studio - Microsoft AndroidNKD64 文件夹占用巨大的磁盘空间。如何去除?

c++ - QML 引擎无法正确导入 C++ 模型

c++ - 当我们开始覆盖内存时,对象的生命周期已经结束了吗?