jjzjj

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

coder 2024-02-20 原文

我在 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

我仍然明白:

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

这不仅会影响我的智能感知,否则我不会在意。真正的问题是它认为 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++ - VS2015 无法理解静态内联函数的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - Railstutorial : db:populate vs. 工厂女孩 - 2

    在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo

  3. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  4. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  5. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  6. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  7. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  8. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  9. ruby - 无法覆盖 irb 中的 to_s - 2

    我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)

  10. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

随机推荐