pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

不同 C++ 文件中的相同類名

Same class name in different C++ files(不同 C++ 文件中的相同類名)
本文介紹了不同 C++ 文件中的相同類名的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

如果兩個 C++ 文件對同名類的定義不同,那么在編譯和鏈接時,即使沒有警告也會拋出一些東西.例如,

If two C++ files have different definitions of classes with the same name, then when they are compiled and linked, something is thrown out even without a warning. For example,

// a.cc
class Student {
public:
    std::string foo() { return "A"; }
};
void foo_a()
{
    Student stu;
    std::cout << stu.foo() << std::endl;
}

// b.cc
class Student {
public:
    std::string foo() { return "B"; }
};
void foo_b()
{
    Student stu;
    std::cout << stu.foo() << std::endl;
}

當使用 g++ 編譯和鏈接在一起時,兩者都會輸出A"(如果在命令行順序中 a.cc 在 b.cc 之前).

When compiled and linked together using g++, both will output "A" (if a.cc precedes b.cc in the command line order).

一個類似的主題是這里.我看到命名空間將解決這個問題,但我不知道為什么鏈接器甚至不發(fā)出警告.如果該類的一個定義具有另一個未定義的額外函數,假設 b.cc 更新為:

A similar topic is here. I see namespace will solve this problem but I don't know why the linker doesn't even shoot a warning. And if one definition of the class has extra function that isn't defined in another, say if b.cc is updated as:

// b.cc
class Student {
public:
    std::string foo() { return "B"; }
    std::string bar() { return "K"; }
};
void foo_b()
{
    Student stu;
    std::cout << stu.foo() << stu.bar() << std::endl;
}

然后 stu.bar() 運行良好.感謝任何能告訴我編譯器和鏈接器在這種情況下如何工作的人.

Then stu.bar() works well. Thanks to anyone who can tell me how the compiler and linker work in such situation.

另外一個問題,如果類是在頭文件中定義的,它們是否應該總是用未命名的命名空間包裝以避免這種情況?有副作用嗎?

As an extra question, if classes are defined in header files, should they always be wrapped with unnamed namespace to avoid such situation? Is there any side effects?

推薦答案

這違反了一個定義規(guī)則(C++03, 3.2/5 "One definition rule"),其中說(除其他外):

This is a violation of the one definition rule (C++03, 3.2/5 "One definition rule"), which says (among other things):

一個類類型可以有多個定義(第 9 條),...在一個程序中,只要每個定義出現在不同的翻譯單元,并提供定義滿足以下條件要求.給定這樣一個名為 D 的實體,定義在多個翻譯單元,然后

There can be more than one definition of a class type (clause 9), ... in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements. Given such an entity named D defined in more than one translation unit, then

  • D 的每個定義都應由相同的記號序列組成;

如果你違反了一個定義規(guī)則,行為是未定義的(這意味著可能會發(fā)生奇怪的事情).

If you violate the one definition rule, the behavior is undefined (which means that strange things can happen).

鏈接器看到多個 Student::foo() 的定義——一個在 a 的目標文件中,一個在 b 的目標文件中.然而,它并沒有抱怨這一點;它只是選擇兩者之一(碰巧,它遇到的第一個).這種對重復函數的軟"處理顯然只適用于內聯函數.對于非內聯函數,鏈接器抱怨多個定義并拒絕生成可執(zhí)行文件(可能有選項可以放寬此限制).GNU ld 和 MSVC 的鏈接器都以這種方式運行.

The linker sees multiple definitions of Student::foo() - one in a's object file and one in b's. However it doesn't complain about this; it just selects one of the two (as it happens, the first one it comes across). This 'soft' handling of duplicate functions apparently happens only for inline functions. For non-inline functions, the linker will complain about multiple definitions and will refuse to produce an executable (there may be options that relax this restriction). Both GNU ld and MSVC's linker behave this way.

這種行為是有道理的;內聯函數需要在它們使用的每個翻譯單元中可用.在一般情況下,它們需要有非內聯版本可用(以防調用未內聯或函數地址被占用).inline 實際上只是圍繞單一定義規(guī)則的免費傳遞 - 但要使其起作用,所有內聯定義都需要相同.

The behavior makes some sense; inline functions need to be available in every translation unit they're used in. And in the general case they need to have non-inline versions available (in case the call isn't inlined or if the function's address is taken). inline is really just a free pass around the one-definition rule - but for it to work, all the inline definitions need to be the same.

當我查看目標文件的轉儲時,我沒有看到任何明顯的東西向我解釋鏈接器如何知道允許一個函數具有多個定義而其他函數則不允許,但我確定有一些標志或記錄就是這樣做的.不幸的是,我發(fā)現鏈接器的工作原理和目標文件的詳細信息并沒有特別詳細的記錄,因此確切的機制可能對我來說仍然是個謎.

When I look at dumps of the object files, I don't see anything obvious that explains to me how the linker knows that one function is permitted to have multiple definitions and others aren't, but I'm sure there's some flag or record which does just that. Unfortunately, I find that the workings of the linker and object file details aren't particularly well documented, so the precise mechanism will probably remain a mystery to me.

至于你的第二個問題:

作為一個額外的問題,如果在頭文件中定義了類,應該它們總是用未命名的命名空間包裹以避免這種情況?有副作用嗎?

As an extra question, if classes are defined in header files, should they always be wrapped with unnamed namespace to avoid such situation? Is there any side effects?

您幾乎肯定不想這樣做,每個類在每個翻譯單元中都是一個不同的類型,因此從技術上講,不能將類的實例從一個翻譯單元傳遞到另一個(通過指針、引用或復制)).此外,您最終會得到任何靜態(tài)成員的多個實例.那可能不會奏效.

You almost certainly don't want to do this each class would be a distinct type in each translation unit, so technically instances of the class they couldn't be passed from one translation unit to another (by pointer, reference or copying). Also, you'd end up with multiple instances of any static members. That probably wouldn't work well.

將它們放在不同的命名空間中.

Put them in different, named namespaces.

這篇關于不同 C++ 文件中的相同類名的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Assertion failed (size.widthgt;0 amp;amp; size.heightgt;0)(斷言失敗(size.width0 amp;amp; size.height0))
Rotate an image in C++ without using OpenCV functions(在 C++ 中旋轉圖像而不使用 OpenCV 函數)
OpenCV: process every frame(OpenCV:處理每一幀)
Why can#39;t I open avi video in openCV?(為什么我不能在 openCV 中打開 avi 視頻?)
OpenCV unable to set up SVM Parameters(OpenCV 無法設置 SVM 參數)
Convert a single color with cvtColor(使用 cvtColor 轉換單一顏色)
主站蜘蛛池模板: 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 超声波清洗机_细胞破碎仪_实验室超声仪器_恒温水浴-广东洁盟深那仪器 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 钢衬玻璃厂家,钢衬玻璃管道 -山东东兴扬防腐设备有限公司 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 地埋式垃圾站厂家【佳星环保】小区压缩垃圾中转站转运站 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 郑州大巴车出租|中巴车租赁|旅游大巴租车|包车|郑州旅游大巴车租赁有限公司 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 鲁尔圆锥接头多功能测试仪-留置针测试仪-上海威夏环保科技有限公司 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 空气净化器租赁,空气净化器出租,全国直租_奥司汀净化器租赁 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 不锈钢酒柜|恒温酒柜|酒柜定制|酒窖定制-上海啸瑞实业有限公司 | 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | 成都网站建设制作_高端网站设计公司「做网站送优化推广」 | 代做标书-代写标书-专业标书文件编辑-「深圳卓越创兴公司」 | 广州活动策划公司-15+年专业大型公关活动策划执行管理经验-睿阳广告 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 阻垢剂-反渗透缓蚀阻垢剂厂家-山东鲁东环保科技有限公司 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 温州富欧金属封头-不锈钢封头厂家 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 | 亿诺千企网-企业核心产品贸易 | 滚珠丝杆升降机_螺旋升降机_丝杠升降机-德迈传动 |