VS2015无法理解静态内联函数

时间:2015-09-29 18:29:27

标签: c++ c visual-studio intellisense

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

static inline UInt32 timer_now() {
    ...

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

typedef unsigned long UInt32;

由于该功能,我的intellisense出现以下问题:

  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下面还有许多其他函数没有任何错误。然后他们会遇到同样的错误。
  6. 我尝试重启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
    

    我仍然明白这一点:

    enter image description here

    为什么我不想只关闭intellisense。

    这不仅影响我的智力,否则我不在乎。真正的问题是,它认为此行中UInt32 已声明

    static inline UInt32 timer_now() {
    

    即。当我在任何UInt32使用时进行定义时,它会将我带到这一行。但更糟糕的是,因为声明为类型UInt32 ANYTHING 无法按定义找到。就像我在我们庞大的代码库中的任何地方一样:

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

    然后 -

    1. VS认为ii未定义。
    2. 你不能按照ii的定义 - 这很疯狂。
    3. 我们在任何地方都使用UInt32Int32,使用这些类型声明的任何内容都不容易找到,这是一个很大的问题。

      为什么我不想只改变inline

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

      当前解决方法

      为了解决这个问题,我现在定义了以下typedef

      typedef UInt32 inlineUInt32;
      

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

2 个答案:

答案 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:

  1. 如果在类中定义了timer_now(),则不需要内联,因为类中的定义始终是内联的。移除以减少混乱。
  2. timer_now()不能在头文件中定义独立功能,因为在这种情况下它不会被标记为'静态'
  3. 如果timer_now()是带有.cpp文件的定义,则不需要内联,因为如果编译器可以内联该函数,它将被内联,并且不需要内联标记它。