Есть хорошая дискуссия об этом. P.J. Plauger ответы на это
Я парень, который настаивал еще в 1983 году, что пространство
имена, доступные для программы на C, можно разбить на:
a) те, которые определены реализацией в интересах программиста (например, printf)
b) те, что зарезервированы для программиста (например, foo)
c) те, которые зарезервированы для реализации (например, _unlink)
Мы даже тогда знали, что «реализация» была слишком монолитной -
часто более одного источника предоставляют биты реализации -
но это было лучшее, что мы могли сделать в то время. Стандарт С ++
ввел пространства имен, чтобы помочь, но они достигли только
часть их заявленных целей. (Вот что происходит, когда ты
стандартизировать бумажного тигра.)
В данном конкретном случае Posix предоставляет список названий категорий (а)
(например, unlink), что вы должны быть определены, когда и только когда вы
включать определенные заголовки. Поскольку стандарт C украл его заголовки из
Unix, который является тем же источником, что и для Posix, некоторые из этих заголовков
исторически пересекаются. Тем не менее, предупреждения компилятора должны иметь
какой-то способ учета того, поддерживается ли среда
это «чистый» Стандарт C ++ (платоновский идеал) или смешанный C / C ++ / Posix
среда. Текущая попытка Microsoft помочь нам бедным
программисты не принимают это во внимание. Настаивает на лечении
отмените связь как имя категории (b), которое является близоруким.
Ну, GCC не будет объявлять имена POSIX в строгом режиме C, по крайней мере (хотя это все еще делает в режиме C ++):
#include <stdio.h>
int main() {
&fdopen;
return 0;
}
Вывод с использованием -std=c99
test.c: In function 'main':
test.c:4: error: 'fdopen' undeclared (first use in this function)
Вы должны будете четко указать, что вы работаете в смешанном C / Posix, используя макросы тестирования функций или не проходя какой-либо конкретный стандарт. Затем по умолчанию будет gnu89
, что предполагает смешанную среду (man feature_test_macros
). По-видимому, MSVC не имеет такой возможности.