不同翻译单元中不可重载的非内联函数定义
Non-overloadable non-inline function definitions in different translation units
假设我有两个TU,其中有两个带有外部链接的非内联函数定义,它们的返回类型不同
我的程序违反了哪些段落
[basic.def.odr]/4表示:
每个程序都应包含每个非内联函数或变量的一个定义,该函数或变量在该程序中使用,而不是丢弃的语句;无需诊断。
但是
- 这段话说"这是odr使用的">可能是也可能不是
- 毕竟,如果我在不同的TU中定义了相同的非内联函数,我该如何判断?[over.dcl]/1谈到了相同的范围
我相信您正在寻找:[basic.link]/9:
如果,两个相同的名称(〔basic.pre〕(和在不同范围中声明的名称应表示相同的变量、函数、类型、模板或命名空间
- 这两个名称都有外部或模块链接,并在附加到同一模块的声明中声明,或者这两个名字都有内部链接并在同一翻译单元中声明;以及
- 两个名称都指同一命名空间的成员,或者指同一类的成员,而不是通过继承;以及
- 当两个名称都表示函数或函数模板时,签名([dfns.signature]、[dfns.signature.templ](是相同的
如果具有外部链接的同一名称的多个声明将声明同一实体,除非它们附加到不同的模块,则程序格式错误;不需要进行诊断。[注意:using声明、typedef声明和alias声明不声明实体,而只是引入同义词。同样,using指令也不声明实体。--end Note]
和[basic.link]/11:
在对类型进行所有调整后(在此期间,typedef被其定义所取代(,引用给定变量或函数的所有声明所指定的类型应相同,除了数组对象的声明可以指定因存在或不存在主数组绑定([dcl.array](而不同的数组类型。违反此类型标识规则不需要诊断。
And[defns.signature]:
⟨函数⟩名称、参数类型列表([dcl.fct](和封闭命名空间(如果有的话(
返回类型不是签名的一部分,因此您违反了相同签名意味着相同实体的规则。
一般来说,在Davis";《我们不配拥有的英雄》;赫林的工作顺利完成。
相关文章:
- 在命名空间中定义函数还是限定函数
- 为什么在定义函数之前先声明它
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 这个c++代码是如何在没有定义函数的情况下运行的
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 将自定义函数传递到基抽象类中以延迟执行
- C++使用 rand 定义函数语法
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 将具有固定签名的自定义函数名称注入 CRTP
- 使用定义函数模板别名
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 在内联程序集中定义函数和从 C++ 调用时出现问题
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 朋友定义函数的名称空间是什么
- 介子 对用户定义函数的未定义引用
- 如何使用 "using" 关键字定义函数原型/签名
- 在 C 结构中定义C++函数