Нечаянно, я написал следующий интересный отрывок:Weird поведения с Определённым STRLEN
#include <iostream>
#include <cstring>
size_t strlen(const char* str) {
std::cout << "hello";
return 0;
}
int main() {
return std::strlen("sdf");
}
Неожиданно для меня, выхода «привет» в GCC 5.1, что означает, что мой strlen
вызывается. Еще более интересно, если я удалю return
, т. Е. Заменим main только вызовом std::strlen("sdf");
, ничего не будет напечатано!
Я также пробовал Clang, для которого std::strlen
вызывает реальную функцию, которая вычисляет длину строки (и ничего не печатается). Это то, что я ожидал увидеть.
Как это можно объяснить? Определяет ли моя собственная функция strlen
считаться неопределенным?
См. [Reserved.names] и [des.c.headers]. –
На моей машине ваш пример segfaults. (linux, gcc-версия 6.2.1 20160830) Я этого не ожидал. Я ожидал, что код напечатает «привет» и выйдет с кодом 0 в операционную систему. – DusteD
Я также получаю segfault с вашим примером (gcc 5.4). Я бы предположил, что чрезвычайно необычно и «рискованно» предоставлять функцию «strlen» в глобальном пространстве имен, поскольку это переопределит версию libc (с привязкой «C»), если вы сначала включили '', так как это естественно переопределяет 'std :: strlen', который может использоваться в другом месте в библиотеке. Например. 'std :: cout', похоже, вызывает вызов' strlen'. –
davmac