首页 > TAG信息列表 > one-definition-rule
C-在模板类之外但在标头中定义成员函数
我用一个成员函数定义了一个简单的类模板.它是在类外部定义的,带有附加的(显式)专业化名称,该类也在类外部定义.全部放在一个头文件中.如果在多个翻译单元中包含此标头,则由于One-Definition-Rule而导致链接器错误. // Header with a template template <class T> class TestClasc – 在头文件中使用常量符合ODR
查看another question我意识到我不能通过头文件使用匿名命名空间中的对象或函数,因为它会在类定义或内联函数中导致ODR违规.如果是这种情况,那么是否可以安全地在内联函数或类中使用命名const或constexpr静态对象?例如,如果CONSTANT位于命名空间下面,那将是不安全的,但是可以使用带c – 使用调试断言时避免ODR违规
我有一个只有头的库,在调试模式下编译时启用了一些额外的失败快速运行时断言.标头的简化版本如下所示: #include <exception> #ifdef MYDEBUG # define MYASSERT(condition) do{ if (!(condition)) std::terminate(); } while(0) #else # define MYASSERT(condition) #endifc – 为什么编译器不在同一个翻译单元中警告ODR违规
在同一个翻译单元中,ODR问题很容易诊断.那么为什么编译器不会在同一个翻译单元中警告ODR违规? 例如,在下面的代码https://wandbox.org/permlink/I0iyGdyw9ynRgny6(下面再现)中,存在ODR违规,检测是否已定义std :: tuple_size.当你取消三和四的定义时,未定义的行为是显而易见的.程序的c – 静态constexpr变量使用了odr吗?
给出下面的代码,是否使用Foo :: FOO1 ODR? #include <iostream> #include <map> #include <string> class Foo { public: static constexpr auto FOO1 = "foo1"; void bar(); }; void Foo::bar() { const std::map<std::string, int> mC标准:ODR和constexpr std :: string_view
如果我有一个包含foo.h的头文件 #ifndef FOO_H_ #define FOO_H_ namespace foo { constexpr std::string_view kSomeString = "blah"; } #endif // FOO_H_ 那么在单个程序中的多个.cc文件中包含foo.h是安全的,无论它们使用符号kSomeString做什么,或者是否有一些可能导致ODR违为什么C链接器对ODR违规没有提及?
让我们考虑一些合成但富有表现力的例子.假设我们有Header.h: 那么header1.h #include <iostream> // Define generic version template<typename T> inline void Foo() { std::cout << "Generic\n"; } Header2.h void Function1(); Header3.h void Function2();