fileno, F_LOCK и F_ULOCK становятся необъявленными и недоступными, когда я добавляю флаг std = c99 в gcc - PullRequest
6 голосов
/ 14 сентября 2009

У меня есть эти заголовки в коде c

#include <stdio.h>
#include <unistd.h>

Все скомпилировалось нормально, пока я не добавил флаг -std = c99 в команду gcc (чтобы включить restrict ). И это вызвало следующие ошибки.

предупреждение: неявное объявление функция fileno

ошибка: F_LOCK необъявленная (первое использование в этой функции)
ошибка: (каждый необъявленный идентификатор сообщается только один раз об ошибке: для каждой функции она появляется в.)
ошибка: F_ULOCK необъявленная (первое использование в этой функции

Есть ли идеи обойти эти ошибки / предупреждения?

Ответы [ 3 ]

8 голосов
/ 14 сентября 2009

Вы должны указать заголовкам, что вы хотите расширения POSIX. В эти дни я использую:

#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */

Если я компилирую с -std=c89, это дает правильную версию POSIX; если вы компилируете с -std=c89, это даст правильную версию POSIX. Я использую это в Solaris 9 и 10, MacOS X (10.4.x, 10.5.x), HP-UX 11.x, Linux (RHEL4 и 5, SuSE 9 и 10) и AIX 5.x и 6.x - AFAICR пока без проблем.

Этот раздел должен появиться до того, как будут включены какие-либо системные заголовки (в вашем собственном заголовке или в каждом исходном файле), или вам нужно добиться того же эффекта с -D_XOPEN_SOURCE=600 в командной строке компилятора или каким-либо другим подобным механизмом.

5 голосов
/ 15 сентября 2009

Попробуйте

-std=gnu99

, чтобы включить все расширения и при этом использовать улучшения языка C99.

1 голос
/ 14 сентября 2009

Вы можете попробовать -D_BSD_SOURCE, чтобы включить BSD-isms или -D_SVID_SOURCE, чтобы включить System-V isms

...