我在Clang和GCC中发现错误了吗
Have I found a bug in Clang and GCC?
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(。所以你的程序可以做任何事情,包括产生你所看到的输出。
相关文章:
- 请发现它在 dev 中工作的错误,但在 hackerrank 中不起作用
- Nanoflann发现邻居提出段错误
- 在使用另一个类"friend"函数时无法发现错误C++
- 无法发现嵌套的循环错误
- Microsoft Visual Studio发现我所有的CUDA设备端函数都有错误
- 如何调试错误代码 77:cudaErrorIllegal地址当 cuda-memcheck 没有发现问题时
- 致命错误LNK1169:在C++Visual Studio中编写战舰游戏时发现的一个或多个多重定义的符号
- 关于Visual Studio 2017中未发现错误的精致询问
- 此CMAKE错误意味着什么?我的变量设置为未发现
- 如何在 clang 消毒器发现错误时终止 clang 检测程序
- 循环素数,帮助发现错误,C++
- 禁用 Eclipse 的错误发现。(科丹误报)
- 为什么在构建C AMP项目期间会发现链接错误
- 找不到正确的 Qt5Core.dll 文件。我发现的每一个都会给出不同的错误
- 我正在尝试遍历 20x20 网格并计算产品,但总是得到不正确的结果。你能帮忙发现我的错误吗?
- CMake发现错误的gcc版本
- 发现逻辑错误 c++
- 任何人都可以在此程序中发现错误(在 2 个通用堆栈中查找相同元素的数量)
- Irrlicht Collada 加载程序警告:发现错误的标记用法:库控制器
- LLVM错误:发现错误的函数,编译中止!后removeFromParent()