Разрешено ли компилятору добавлять функции в стандартные заголовки? - PullRequest
7 голосов
/ 25 ноября 2011

Разрешено ли компилятору C добавлять функции в стандартные заголовки и при этом соответствовать стандарту C?

Я где-то читал это, но не могу найти никаких ссылок в стандарте, кроме как в приложении J.5:

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

Однако Приложение J является информативными не нормативно ... так что это не помогает.

Так что мне интересно, нормально ли для соответствующего компилятора добавлять дополнительные функции в стандартные заголовки?

Например, допустим, он добавляет нестандартную версию itoa в stdlib.h.

Ответы [ 3 ]

12 голосов
/ 25 ноября 2011

В 4. «Соответствие» §6 имеется:

Соответствующая реализация может иметь расширения (включая дополнительные библиотечные функции), при условии, что они не изменяют поведение каких-либо строго соответствующих программа.

с немедленным заключением в сноске:

Это подразумевает, что соответствующая реализация не оставляет никаких идентификаторов, кроме явно указанных Зарезервировано в этом международном стандарте.

Зарезервированные идентификаторы описаны в 7.1.3. По сути, это все, начинающееся с подчеркивания, и все, что явно указано для стандартных библиотек.

Итак, да, компилятору разрешено добавлять расширения. Но они должны иметь имя, начинающееся с подчеркивания или одного из префиксов, зарезервированных для библиотек.

itoa не является зарезервированным идентификатором, и компилятор, определяющий его в стандартном заголовке, не соответствует.

5 голосов
/ 25 ноября 2011

В «7.26 Будущие направления библиотеки» у вас есть список идентификаторов, которые могут быть добавлены к стандартным заголовкам, включая идентификаторы, начинающиеся с str или mem, макросы, начинающиеся с E, и тому подобное.

Кроме этого, реализации ограничены родовыми именами, как зарезервировано в «7.1.3 Зарезервированные идентификаторы».

1 голос
/ 26 ноября 2011

Компиляторы для встроенных систем регулярно добавляют функции и макросы в стандартные заголовки, обычно для того, чтобы сделать доступной для использования особую функцию процессора.

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

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

...