关于What determines which class definition is included for identically-named classes in two source files?,其中有意,明显地违反了One Definition Rule,我仍然感到困惑,即使编译器/链接器可以选择一个定义而不是另一个定义也是如此。
(基于答案/评论的附录:我正在寻找一个示例,说明给定的代码故意违反标准,因此该代码导致未定义的行为,因此编译器/链接器如何产生以下所示的结果。)
代码示例是:
// file1.cpp:
#include <iostream>
#include "file2.h"
struct A
{
A() : a(1) {}
int a;
};
int main()
{
// foo() <-- uncomment this line to draw in file2.cpp's use of class A
A a; // <-- Which version of class A is chosen by the linker?
std::cout << a.a << std::endl; // <-- Is "1" or "2" output?
}
//file2.h:
void foo();
// file2.cpp:
#include <iostream>
#include "file2.h"
struct A
{
A() : a(2) {}
int a;
};
void foo()
{
A a; // <-- Which version of class A is chosen by the linker?
std::cout << a.a << std::endl; // <-- Is "1" or "2" output?
}
foo()有时会打印1,有时会打印2。A的构造函数是内联的!这不是函数调用!因此,我认为编译器必须在编译函数a时将用于实例化对象foo()的代码的汇编/机器指令包括在函数foo()本身的已编译代码中。foo()包含在已编译的二进制文件中时,它不会更改foo()的定义的汇编/机器指令(因为仅知道foo()实际上是,在链接时被调用)。根据这种推理,链接器可能不会影响将哪个内联构造函数代码编译到函数foo()中,因此,尽管故意违反了“一个定义规则”,但它必须始终是file2内联构造函数的版本。A的构造函数不是内联的,那么我会理解,当编译函数foo()时,可以将对函数的JUMP语句(A的构造函数)放在函数foo()的汇编代码中;然后,在链接时,链接器随后可以选择A的构造函数的两个定义来填充JUMP语句的地址。foo()会打印1,有时foo()会打印2是,编译器在编译“file2.cpp”时会在已编译的程序集中创建SPACE/机器代码,表示对A的构造函数的内联调用的foo()函数,但实际上未填写汇编/机器代码本身;稍后,在链接时,链接器使用它的内联函数的两个定义之间的(任意)选择,将A的构造函数的代码复制到函数foo()本身的已编译定义内的预定位置。 A的构造函数。A的构造函数?A a;行放置了一个断点,并选择了“反汇编” View 。确实,从反汇编代码开始,尽管不存在“内联”,但在这种情况下,编译器选择不内联对象a的构造函数调用:inline,但尚未内联构造函数调用。inline)?如果可以对此做出陈述,并且答案是“是的,则编译器更倾向于拒绝构造函数的inline,而不是拒绝常规成员函数的inline”,那么后续问题将是“为什么“?
最佳答案
在类定义中定义构造函数等同于使用关键字inline及其父类(super class)定义。inline不需要/保证机器代码的内联扩展。它暗示了这一点,仅此而已。inline的保证效果是允许在多个翻译单元中对函数进行相同的定义(然后必须在使用该翻译单元的所有翻译单元中对其进行基本上相同的定义)。
因此,基于错误要求/保证的内联扩展的假设的逻辑将由于错误的假设而得出错误的结论。
关于c++ - 尽管违反了一个定义规则,但是编译器/链接器如何选择替代的内联构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13625629/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c
如何将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.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful
对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking