C 警告:函数‘fchmod’的隐式声明

问题描述 投票:0回答:3

我有一个使用 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’

我包含了所有正确的文件,但收到此警告。即使有警告,程序也运行良好。

c compiler-warnings
3个回答
6
投票

巧合的是,您的问题直接由

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

2
投票

您没有指定您使用的编译器或平台,但在我最近安装的 Linux 中,fchmod() 是在几个 #ifdef(__USD_BSD 和 __USE_XOPEN_EXTENDED)中定义的,但由几个 #ifdef 保护。

您不应该直接设置它们,而是通过 .尝试定义 _XOPEN_SOURCE_EXTENDED 或仅定义 _GNU_SOURCE 并重新编译(请注意,这些宏启用非标准功能,并且使用它们启用的功能可能会限制代码的可移植性)。


0
投票

我在构建 uml 时遇到了这个错误。
只需在引发此错误的文件中添加此行:

#include "sys/stat.h"

我相信它会关心添加上述答案中定义的宏。

© www.soinside.com 2019 - 2024. All rights reserved.