我在Clang和GCC中发现错误了吗

Have I found a bug in Clang and GCC?

本文关键字:错误 发现 Clang GCC 我在      更新时间:2024-09-29

main.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((write"home/madmin/CLionProjects/bug/cls.cpp:5〃;到std::cout。

当(1(被取消注释时,call_some_method((写入"/home/mamin/CLionProjects/bug/main.cpp:5〃;到std::cout。

如何实现不同的输出?

__FILE____LINE__是由预处理器扩展的宏。由于这些宏位于不同的文件中,并且取决于它们所使用的文件,因此它们会扩展到不同的令牌序列。

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

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