背景/需求
编译错误:error: implicit declaration of function ‘getopt’ [-Werror=implicit-function-declaration]
解释
在某些C标准中,要求函数必须在调用前具有显示声明,例:
void function_a(); //函数声明
int main(){
function_a();//函数调用
}
void function_a(){
//函数实现或者叫函数定义
}
若在调用前没有显示声明,则报编译错误,例:
//void function_a(); //函数声明
int main(){
function_a();//函数调用
}
void function_a(){
//函数实现或者叫函数定义
}
使用getopt
方法时,需要先#include <utistd.h>
,utistd.h
中又进行了#include<getopt.h>
的包含,因此,最终getopt函数的声明存在于getopt.h
文件中,查看该文件:
- cd /usr/include/
- vim getopt.h
- 注意中间这部分代码:
...
...
#ifdef __GNU_LIBRARY__
/* Many other libraries have conflicting prototypes for getopt, with
differences in the consts, in stdlib.h. To avoid compilation
errors, only prototype getopt for the GNU C library. */
extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
__THROW;
# if defined __need_getopt && defined __USE_POSIX2 \
&& !defined __USE_POSIX_IMPLICITLY && !defined __USE_GNU
/* The GNU getopt has more functionality than the standard version. The
additional functionality can be disable at runtime. This redirection
helps to also do this at runtime. */
# ifdef __REDIRECT
extern int __REDIRECT_NTH (getopt, (int ___argc, char *const *___argv,
const char *__shortopts),
__posix_getopt);
# else
extern int __posix_getopt (int ___argc, char *const *___argv,
const char *__shortopts) __THROW;
# define getopt __posix_getopt
# endif
# endif
#else /* not __GNU_LIBRARY__ */
extern int getopt ();
#endif /* __GNU_LIBRARY__ */
...
...
分析可知,只有定义了__GNU_LIBRARY__才可以使用int getopt (int ___argc, char *const *___argv, const char *__shortopts) __THROW;
这个函数声明文章来源:https://www.toymoban.com/news/detail-573864.html
解决方法
目前我在编译时添加了选项:-std=gnu99
而不是-std=c99
,实测通过了编译。文章来源地址https://www.toymoban.com/news/detail-573864.html
到了这里,关于编译错误 error: implicit declaration of function ‘getopt’ [-Werror=implicit-function-declaration] 解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!