簡體   English   中英

使用 -std=c99 的隱式聲明

[英]implicit declaration using -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>

問題在於您使用了-std=c99選項。 由於strndup()不是C99 的一部分,並且您要求編譯器進入標准兼容模式,因此它不會為其提供原型。 當然它仍然鏈接,因為你的 C 庫有它。

雖然您可以通過自己指定功能宏來哄gcc提供它,但我認為處於 C99 合規模式要求 GNU 擴展沒有多大意義。 gcc已經為此提供了一種模式,它將解決您的警告: -std=gnu99

我的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

所以我需要,例如,第一個#include之前#define POSIX_C_SOURCE 200809L
參見man 7 feature_test_macros

strndup是 GNU 擴展,因此您需要在命令行上使用-D_GNU_SOURCE進行編譯,或者在源文件中的#include行之前添加#define _GNU_SOURCE 1

這發生在我身上,我添加了#define _XOPEN_SOURCE 500並且警告消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM