gpt4 book ai didi

c++ - 我在 Clang 和 GCC 中发现了错误吗?

转载 作者:行者123 更新时间:2023-12-03 06:55:57 24 4
gpt4 key购买 nike

主要.cpp:

#include <iostream>

struct Cls {
static void some_method() {
std::cout << __FILE__ << ": " << __LINE__ << std::endl;
}
};

extern void call_some_method();

void never_caled() {
Cls::some_method(); // (1)
}

int main() {
call_some_method();
return 0;
}

cls.cpp:

#include <iostream>

struct Cls {
static void some_method() {
std::cout << __FILE__ << ": " << __LINE__ << std::endl;
}
};

void call_some_method() {
Cls::some_method();
}

当 (1) 被注释时,call_some_method() 将“/home/maxim/CLionProjects/bug/cls.cpp: 5”写入 std::cout。

当 (1) 取消注释时,call_some_method() 将“/home/maxim/CLionProjects/bug/main.cpp: 5”写入 std::cout。

不同的输出怎么可能?

最佳答案

__FILE____LINE__ 是预处理器扩展的宏。由于这些宏位于不同的文件中,并且取决于它们在其中使用的文件,因此它们扩展为不同的标记序列。

这意味着您对 Cls::some_method 的定义在不同的翻译单元中是不同的。这违反了单一定义规则 ( ODR ),除其他外,该规则要求在整个程序中对特定实体只有一个定义。如果有多个定义,那也没关系,只要这些定义的标记序列在每个翻译单元中都是相同的,并且这些标记在解析时表示相同的东西。

在你的情况下这显然不是真的,所以你违反了 ODR,这使得程序格式错误(不需要诊断)。这意味着编译器没有义务给你一个错误,但如果它确实产生了一个程序,那么执行该程序会调用未定义的行为(UB)。因此,您的程序可以做任何事情,包括生成您所看到的输出。

关于c++ - 我在 Clang 和 GCC 中发现了错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64840566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com