Неявное объявление с использованием -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>
Ответы
Ответ 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
, и предупреждение исчезло.