我的问题:从 POSIX 上的 errno 值和 Windows 上的 GetLastError() 构造 std::error_code 实例的正确方法是什么以便可以将实例与 std::errc?
更长的解释:我的目标是将一个 std::error_code 实例添加到一个自制的异常对象中,该对象以 C++11 的方式在 POSIX 和 Windows 系统上工作。
在我的跨平台应用程序中,我使用的是自制的 I/O 类层次结构,它使用 POSIX fopen() 和 Windows 的 CreateFile() 调用用于打开/创建文件。如果失败,则会抛出一个通用的、自制的 open_error 异常(它是从 std::exception 派生的,是的,但它不是 C++ 的预定义异常类之一)。我正在尝试使用错误代码扩展这个相当简单的异常;如果我理解正确的话,更准确地说是 C++11 的 std::error_code。
我的问题是如何从 errno (在 POSIX 情况下)或 GetLastError() (在 Windows 情况下)构造这样的对象。对于 POSIX,据我了解,我可以简单地在 std::error_code 的构造函数中使用 errno,例如像这样:
std::error_code ec(errno, std::generic_category());
并且 ec 应该与 std::errc 中的知名值相当。
对于 Windows,当然可以进行类似的调用:
std::error_code ec(::GetLastError(), std::generic_category());
但我不确定 GetLastError() 返回的值是否很好地映射到来自 std::errc 的众所周知的常量。我已阅读 in Boost's system library他们这样做是为了Boost 的 error_code 实现,但我问的是 std 实现,而不是 Boost。
请不要建议切换到使用 C++ 流进行文件访问。我很乐意,但目前我不想重构我的一半代码。
最佳答案
这是实现质量问题。 std::system_category() 返回的 const 静态对象依赖于执行从平台原生错误代码枚举到标准 std::error_condition 枚举的映射。 17.6.5.14 错误码值[value.error.codes]下:
Implementations for operating systems that are not based on POSIX are encouraged to define values identical to the operating system’s values.
您可以在 http://www.boost.org/doc/libs/1_46_1/libs/system/src/error_code.cpp 中查看Boost 如何执行映射;您的编译器供应商提供的用于 Windows 的任何标准库都应该执行类似的操作。
19.5.1.5p4 中涵盖了预期的行为,描述了 system_category().default_error_condition(int ev):
If the argument
evcorresponds to a POSIX errno valueposv, the function shall returnerror_condition(posv, generic_category()). Otherwise, the function shall returnerror_condition(ev, system_category()).
例如,error_code(ERROR_FILE_NOT_FOUND, std::system_category()).default_error_condition() 将调用 std::system_category().default_error_condition(ERROR_FILE_NOT_FOUND) ,它应该返回 std::error_condition(std::no_such_file_or_directory, std::generic_category())。
关于c++ - 从 POSIX 上的 errno 和 Windows 上的 GetLastError() 构造 std::error_code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13950938/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我正在使用这个:4.times{|i|assert_not_equal("content#{i+2}".constantize,object.first_content)}我之前声明过局部变量content1content2content3content4content5我得到的错误NameError:wrongconstantnamecontent2这个错误是什么意思?我很确定我想要content2=\ 最佳答案 你必须用一个大字母来调用ruby常量:Content2而不是content2。Aconstantnamestart
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是: