#c #compiler-construction #compiler-warnings
#c #конструкция компилятора #компилятор-предупреждения
Вопрос:
У меня есть функция 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’
Я включаю все правильные файлы, но получаю это предупреждение. Программа работает нормально, даже с предупреждением.
Комментарии:
1. @Falmarri Нет, но у них есть тенденция сообщать вам, что что-то может быть не так с вашим кодом. Это хорошая идея, чтобы прислушаться к ним.
2. @Falmarri Да, я знаю. Однако приятно компилироваться с помощью -Wall и не иметь никаких предупреждений … и я никогда не говорил, что пытаюсь исправить ошибку
3. Где комментарий Фалмарри?
Ответ №1:
По счастливому совпадению, на 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 и перекомпилировать (и обратите внимание, что эти макросы обеспечивают нестандартную функциональность, и использование функциональности, которую они включают, может ограничить переносимость вашего кода).
Ответ №3:
Я столкнулся с этой ошибкой при создании uml.
Просто добавьте эту строку в файл, в котором выдается эта ошибка:
#include "sys/stat.h"
Я полагаю, что он позаботится о добавлении макросов, определенных в приведенных выше ответах.