Подтвердить что ты не робот

Неявное объявление с использованием -std = c99

Я получаю это предупреждение: (-std=c99 -pedantic)

warning: implicit declaration of function ‘strndup’ [-Wimplicit-function-declaration]

но я импортирую эти библиотеки:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Так что?!: (


// file.c:
    #include "file.h"
    strndup(...)
// file.h:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
4b9b3361

Ответ 1

Проблема заключается в использовании опции -std=c99. Поскольку strndup() не является частью C99, и вы просите компилятор перейти в режим, совместимый со стандартами, он не предоставит прототип для него. Конечно, это все еще связано с ссылками, потому что у вашей библиотеки C есть.

Пока вы можете уговорить gcc предоставить его, указав макросы функций самостоятельно, я бы сказал, что не имеет смысла быть в режиме соблюдения C99 и, например, запрашивать расширения GNU. gcc уже предоставляет режим для этого, который решит ваше предупреждение: -std=gnu99.

Ответ 2

Мой man strndup говорит

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup():
           _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
           _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
       strndup():
           Since glibc 2.10:
               POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
           Before glibc 2.10:
               _GNU_SOURCE
       strdupa(), strndupa(): _GNU_SOURCE

Итак, мне нужно, например, #define POSIX_C_SOURCE 200809L перед первым #include.
см. man 7 feature_test_macros

Ответ 3

strndup - это расширение GNU, поэтому вам нужно скомпилировать с -D_GNU_SOURCE в командной строке или вставить #define _GNU_SOURCE 1 в исходные файлы до строк #include

Ответ 4

Это случилось со мной, и я добавил #define _XOPEN_SOURCE 500, и предупреждение исчезло.