2011-05-07 45 views
3

我有一个函数,CREATEFILE使用fchmod的隐式声明:C警告:函数 'fchmod'

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

警告不是错误。 – Falmarri 2011-05-07 01:27:40

+5

@Falmarri不,但他们倾向于告诉你代码可能有问题。倾听他们的想法是个好主意。 – 2011-05-07 01:31:14

+0

@Falmarri是的,我知道。不过,使用-Wall进行编译并不会有任何警告......并且我从来没有说过我正在尝试纠正错误 – itzhero 2011-05-18 16:25:18

回答

4

可巧,你的问题是直接由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()被定义在一些#ifdefs(__USD_BSD和__USE_XOPEN_EXTENDED)中,但被保护。

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

0

同时建立UML我面临这个错误。
在文件中只需添加这条线,其中引发此错误:

#include "sys/stat.h" 

我相信它会照顾有关添加上述答案定义的宏。