Я столкнулся с similar problem в моем (большом) проекте.Почему у меня нет «неопределенной ссылки на»?
//# include <string.h> // not included
void foo(char * str, const char * delim)
{
char * tok = strtok(str, delim);
// warning^"assignement makes pointer from integer without a cast"
// [...]
}
Ответ (просто добавить #include <string.h>
иметь прототип strtok
) решается вопрос, действительно.
Однако из-за моего плохого знания компилятора/компоновщика я не понимаю, как процесс принимает функцию, которая не была прототипирована. Я предпочел бы ожидать ошибку undefined reference to function 'strtok'
, которая типична, когда вы забудете включить правый заголовок.
[EDIT] Я понимаю, почему этот вопрос был отмечен как дубликат, но я думаю, что это другое: я знаю о «хорошей практике», касающейся включений, мне просто интересно о поведении компилятора. Однако я признаю, что я могу нашел (часть) ответ на свой вопрос в этом посте: Are prototypes required for all functions in C89, C90 or C99? или это один: Must declare function prototype in C?
Короткий ответ: вы получите сообщение об ошибке, если вы скомпилируете код как C99 или новее. Добавьте флаг gcc '-std = c11' или' -std = c99'. –
Компилятор никогда не будет «бросать» (что бы это ни значило) или сообщить об этой ошибке. Это линкер. И независимо от «необходимости»: вы окончательно ** должны **. Любой средний уровень современного кодирования последних 20 лет требует этого. – Olaf
@Olaf Fixed (это уже ключ к ответу на мой пост). Любой шанс вернуть знак «дубликат» после моего редактирования? – Coconop