我有一个使用fchmod的函数createFile:
int createFile(char *pFileName) {
int ret;
if ((ret = open(pFileName, O_RDWR | O_CREAT | O_TRUNC)) < 0)
errorAndQuit(2);
fchmod(ret, S_IRUSR | S_IWUSR);
return ret;
}
在我的文件顶部,我有以下内容:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
编译时:编译器吐出:
warning: implicit declaration of function ‘fchmod’
我已经包含了所有正确的文件,但却收到了此警告。该程序运行正常,即使有警告。
答案 0 :(得分:5)
巧合的是,feature_test_macros(7)
联机帮助页直接回答了您的问题:
Specification of feature test macro requirements in manual pages
When a function requires that a feature test macro is
defined, the manual page SYNOPSIS typically includes a note
of the following form (this example from the chmod(2) manual
page):
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
Feature Test Macro Requirements for glibc (see
feature_test_macros(7)):
fchmod(): _BSD_SOURCE || _XOPEN_SOURCE >= 500
The || means that in order to obtain the declaration of
fchmod(2) from <sys/stat.h>, either of the following macro
definitions must be made before including any header files:
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500 /* or any value > 500 */
Alternatively, equivalent definitions can be included in the
compilation command:
cc -D_BSD_SOURCE
cc -D_XOPEN_SOURCE=500 # Or any value > 500
答案 1 :(得分:2)
您没有指定您正在使用的编译器或平台,但在我最近的Linux安装中,fchmod()已定义,但由几个#ifdefs(__USD_BSD和__USE_XOPEN_EXTENDED)保护。
您不应该直接设置它们,而是通过_FOO_SOURCE宏设置。尝试定义_XOPEN_SOURCE_EXTENDED或只是_GNU_SOURCE并重新编译(并注意这些宏启用非标准功能,并且使用它们启用的功能可能会限制代码的可移植性。)
答案 2 :(得分:0)
我在构建uml时遇到了这个错误 只需在引发此错误的文件中添加此行:
#include "sys/stat.h"
我相信它会关注添加上述答案中定义的宏。