Я прохожу курс на C после многолетнего программирования. Мой инструктор не использует машину POSIX, и я недавно был наказан за использование функции index
в задании. Я провел некоторое исследование, и я заметил, что, хотя index
был ранней частью AT & T Unix и совместим с POSIX, он не является частью стандарта C99. Я бы хотел, чтобы gcc помог мне найти похожие символы. Я компилирую на OSX с gcc 4.2 (не llvm)
Мой первый этап исследования включал в себя уведомление о том, что мой файл string.h обертывает прототип для index
в следующей проверке на макросы проверки функций:
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
После небольшого рытья я нашел это (в моем /usr/include/sys/cdefs.h
):
/* STRICT Defining _POSIX_C_SOURCE or _XOPEN_SOURCE restricts the
* available APIs to exactly the set of APIs defined by the
* corresponding standard, based on the value defined.
*
* A correct, portable definition for _POSIX_C_SOURCE is 200112L.
* A correct, portable definition for _XOPEN_SOURCE is 600L.
*/
И так с помощью этой команды gcc:
gcc -D _POSIX_C_SOURCE=200112L -pedantic -Wall -std=c99 -o myExec ./mySource.c
Я получаю достойное предупреждение:
warning: incompatible implicit declaration of built-in function ‘index’
Это меня смущает, и я хочу, чтобы программа также не смогла соединить. Причина, по которой меня это смущает, я читаю на opengroup.org, что определение этого макроса должно показывать символы POSIX, а не скрыть их. Итак, вот мой вопрос в сжатой форме:
Как я могу сделать gcc 4.2 (на OSX 10.6) компилировать и связывать мою программу в среде, которая строго C99 без каких-либо дополнительных символов?
В идеале я хочу предупреждать во время компиляции и не связывать. Я надеюсь, что ответ не связан с сообщением gcc о том, что я пишу код POSIX, когда считаю, что это противоположность тому, что я хочу сказать. Что я не понимаю?