为什么C链接器对ODR违规没有提及?
让我们考虑一些合成但富有表现力的例子.假设我们有Header.h:
那么header1.h #include <iostream> // Define generic version template<typename T> inline void Foo() { std::cout << "Genericn"; } Header2.h void Function1(); Header3.h void Function2(); Source1.cpp #include "Header1.h" #include "Header3.h" // Define specialization 1 template<> inline void Foo<int>() { std::cout << "Specialization 1n"; } void Function1() { Foo<int>(); } 后来我或其他人在另一个源文件中定义了类似的转换. #include "Header1.h" // Define specialization 2 template<> inline void Foo<int>() { std::cout << "Specialization 2n"; } void Function2() { Foo<int>(); } main.cpp中 #include "Header2.h" #include "Header3.h" int main() { Function1(); Function2(); } 问题是什么会打印Function1()和Function2()?答案是未定义的行为. 我希望在输出中看到: 但我明白了: 为什么C编译器对ODR违规保持沉默?在这种情况下,我更希望编译失败. 我发现只有一种解决方法:在未命名的命名空间中定义模板函数. 解决方法
编译器是静默的,因为它不需要在
[basic.def.odr/4]之前发出任何内容:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 常用 U-boot命令详解
- PostgreSQL9.6:Parallel sequential scans 初体验
- Error: You need to install postgresql-server-dev-X.Y fo
- Hacker News 4月14日热帖:模糊测试SQLITE
- ssis – 生成脚本 – 仅数据 – 发现循环依赖错误
- activerecord – Rails 3:使用form_for的非Active Record对
- oracle RAC LOG_ARCHIVE_DEST_1 与 LOG_ARCHIVE_DEST 冲突解
- c# – 如何将System.Web引用添加到Windows窗体应用程序
- PULL解析XML
- c – 如何为同类型提供隐式和显式转换ctr?