implicit declaration using -std=c99

匿名 (未验证) 提交于 2019-12-03 01:45:01

问题:

I'm getting this warning: (-std=c99 -pedantic)

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

but I'm importing these libs:

#include  #include  #include 

So what?! :(


// file.c:     #include "file.h"     strndup(...) // file.h:     #include      #include      #include 

回答1:

The issue is your usage of the -std=c99 option. Since strndup() isn't part of C99, and you're asking the compiler to go into standards compliant mode, it won't provide the prototype for it. It still links of course, because your C library has it.

While you may be able to coax gcc into providing it by specifying feature macros yourself, I'd say it doesn't make much sense to be in C99 compliance mode and ask for GNU extensions for example. gcc already provides a mode for this, which will solve your warning: -std=gnu99.



回答2:

My man strndup says

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

So I'd need to, eg, #define POSIX_C_SOURCE 200809L before the first #include.
see man 7 feature_test_macros



回答3:

strndup is a GNU extension, so you need to compile with -D_GNU_SOURCE on the command line, or stick a #define _GNU_SOURCE 1 in your source files before the #include lines



回答4:

This happened to me, and I added #define _XOPEN_SOURCE 500 and the warning went away.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!