Skip to content

求解释什么是"ODR使用" #215

Answered by Mq-b
mq-loser asked this question in Q&A
Discussion options

You must be logged in to vote

ODR 使用

文档原话:

非正式地说: 1. 一个对象在它的值被读取(除非它是编译时常量)或写入,或它的地址被取,或者被引用绑定时,这个对象被 ODR 使用。 2. 使用“所引用的对象在编译期未知”的引用时,这个引用被 ODR 使用。 3. 一个函数在被调用或它的地址被取时,被 ODR 使用。 如果一个对象、引用或函数被 ODR 使用,那么程序中必须有它的定义;否则通常会有链接时错误。

先关注最后一句话:

如果一个对象、引用或函数被 ODR 使用,那么程序中必须有它的定义;否则通常会有链接时错误

这是 ODR 使用了却没有定义的后果,我们要先明确,接下来解释规则。


  1. 一个对象在它的值被读取(除非它是编译时常量)或写入,或它的地址被取,或者被引用绑定时,这个对象被 ODR 使用。
struct X{
    static const int n = 10; // 这个 n 只是类内声明,没有定义
};

那么好,如果我们读取这个 n(比如打印),这个它是否是 ODR 使用?不会,因为它是编译时常量

std::cout << X::n << '\n';    // 不是 ODR 使用 没问题
std::cout << &X::n << '\n';   // 地址被取,是 ODR 使用

那么 ODR 使用了却没有定义的后果?最开始说了,有可能是链接错误。

给出完整代码:

#include <iostream>

struct X{
    static const int n = 10;
};

int main()
{
    std::cout << X:…

Replies: 1 comment

Comment options

You must be logged in to vote
0 replies
Answer selected by mq-loser
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
category: daily 卢瑟日经
2 participants