详细解释如下,问题在底部。
我的问题具体指的是当前的 C++ 标准草案(也是当前的“主要”标准)here .更具体地说,关于成员函数和 ODR,第 3.2 节第 6 点(第 35 页)指出 D 的每个定义应包含相同的标记序列。
最近在项目中添加新的数据分析时遇到了如下问题。
我正在写一个文件,A.cpp。我创建了一个小的虚拟结构来保存一些数据。在此示例中,我将其称为 Data。
namespace Example {
struct Data {
//etc
};
//Use Data
};
但是在另一个文件 B.cpp 中,Example 命名空间中已经有一个名为 Data 的结构。编译器为这两个类生成 Data::~Data();,然后调用它们各自成员的析构函数。 B.cpp 中的定义包含一个 vector ,当使用 A.cpp 中定义的布局调用 Data 结构时,该 vector 被破坏时会导致爆炸。虽然这两个结构似乎都能正常工作,没有编译时错误,但似乎在链接时链接器会选择一个定义并使用它,而忽略另一个定义。 (因此导致 A.cpp 内的 Data 对象爆炸)
在 GCC 或 MSVC 下都没有发出警告。 启用优化后,问题不会发生(函数是内联的,没有链接时间困惑)。
我的问题是,标准只声明行为是未定义的如果 D 是一个模板并且在多个翻译单元中定义。
要么我误解了标准,允许未定义的行为悄悄发生;或者 GCC 和 MSVC 都默默地接受他们不应该接受的东西(并且应该拒绝产生输出或发出警告)(当前情况是未定义和不一致的行为,没有诊断)。
有人可以帮我理解这与类中未定义的函数定义的冲突有何不同(这确实会导致警告/错误)。
最佳答案
Could someone please help me understand how this is different to conflicting definitions of functions that are not defined in classes (which do cause warnings/errors).
不同之处在于类内的函数定义在名义上是隐式内联,如果再次遇到该函数,它会抑制编译器警告。这并不意味着编译器必须内联它们——它可能会决定使用任何启发式方法而不去打扰,或者它可能简单地从不在某些优化级别内联。无论如何,如果您链接的代码看到了名义上内联非成员函数的不同定义,那么您会遇到完全相同的问题。
见 3.2/6
There can be more than one definition of a class type ... in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements.
— each definition of D shall consist of the same sequence of tokens; and
[others requirements]
更一般地说,您应该将您的代码放入匿名命名空间...它们旨在防止此类跨翻译单元问题。
关于C++ 自动实现的函数和 ODR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20470369/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
如何将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.你能做的最好的事情是: