我不小心写了下面这个有趣的片段:
#include <iostream>
#include <cstring>
size_t strlen(const char* str) {
std::cout << "hello";
return 0;
}
int main() {
return std::strlen("sdf");
}
出乎意料的是,在 GCC 5.1 中输出结果为 "hello",这意味着我的 strlen
被调用了。更有趣的是,如果我移除 return
,即使用 std::strlen("sdf");
替换 main 函数,就没有任何输出!
我还尝试了 Clang,它会调用真正计算字符串长度的函数 std::strlen
(且没有任何输出)。这正是我所期望见到的。
这是如何解释的?定义自己的 strlen
函数是否被视为未定义行为?
strlen
函数,因为这样会覆盖 libc 版本(采用 "C" 链接方式),如果你首先包含<cstring>
,则该问题变得非常罕见和“危险”。这自然会覆盖std::strlen
,可能会在库的其他地方使用。例如,std::cout
看起来会生成对strlen
的调用。 - davmac