неявное объявление с использованием -std = c99 - PullRequest
12 голосов
/ 07 февраля 2012

Я получаю это предупреждение: (-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>

Ответы [ 4 ]

29 голосов
/ 07 февраля 2012

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

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

8 голосов
/ 07 февраля 2012

Мой 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

6 голосов
/ 07 февраля 2012

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

1 голос
/ 12 июня 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...