C предупреждение: неявное объявление функции 'fchmod' - PullRequest
3 голосов
/ 07 мая 2011

У меня есть функция createFile, которая использует 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’

Я включаю все правильные файлы, но получаю это предупреждение. Программа работает нормально, даже с предупреждением.

Ответы [ 3 ]

5 голосов
/ 07 мая 2011

По счастливому стечению обстоятельств, на ваш вопрос прямо ответила справочная страница 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 голосов
/ 07 мая 2011

Вы не указали, какой компилятор или платформу вы используете, но в моей последней установке Linux fchmod () определяется, но защищается парой #ifdefs (__USD_BSD и __USE_XOPEN_EXTENDED).

Вы не должны устанавливать их напрямую, а через макросы _FOO_SOURCE. Попробуйте определить _XOPEN_SOURCE_EXTENDED или просто _GNU_SOURCE и перекомпилировать (и обратите внимание, что эти макросы включают нестандартные функции, а использование включаемых функций может ограничить переносимость вашего кода).

0 голосов
/ 14 февраля 2012

Я столкнулся с этой ошибкой при сборке uml.
Просто добавьте эту строку в файл, в который выдается эта ошибка:

#include "sys/stat.h"

Я думаю, что он позаботится о добавлении макросов, определенных вОтветы выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...