我有一个使用 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’
我包含了所有正确的文件,但收到此警告。即使有警告,程序也运行良好。
巧合的是,您的问题直接由
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
您没有指定您使用的编译器或平台,但在我最近安装的 Linux 中,fchmod() 是在几个 #ifdef(__USD_BSD 和 __USE_XOPEN_EXTENDED)中定义的,但由几个 #ifdef 保护。
您不应该直接设置它们,而是通过 .尝试定义 _XOPEN_SOURCE_EXTENDED 或仅定义 _GNU_SOURCE 并重新编译(请注意,这些宏启用非标准功能,并且使用它们启用的功能可能会限制代码的可移植性)。
我在构建 uml 时遇到了这个错误。
只需在引发此错误的文件中添加此行:
#include "sys/stat.h"
我相信它会关心添加上述答案中定义的宏。