Соответствие стандарту C — идентификаторы

Я ищу некоторые разъяснения по частям стандарта C (C99 и/или C11), в основном по использованию идентификаторов.
Контекстом является реализация полной стандартной библиотеки C99, который я хочу, чтобы он полностью соответствовал стандарту.

Основной вопрос: до какой степени стандарт C позволяет мне объявлять идентификаторы/символы, не перечисленные в стандарте?

В качестве примера рассмотрим макрос isfinite из math.h.
Возможная реализация может быть следующей:

#define isinf( _x_ )                                                       \
    (                                                                      \
        ( sizeof( _x_ ) == sizeof( float  ) ) ? _c99_math_isinf_f( _x_ ) : \
        ( sizeof( _x_ ) == sizeof( double ) ) ? _c99_math_isinf_d( _x_ ) : \
                                                _c99_math_isinf_l( _x_ )   \
    )

int _c99_math_isinf_f( float x );
int _c99_math_isinf_d( double x );
int _c99_math_isinf_l( long double x );

Здесь мне нужно объявить дополнительные идентификаторы, которые явно не являются частью стандарта C.

В примечании 3 к разделу 4 стандарта C99 (Соответствие) мы можем прочитать:

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

Я не уверен, что понимаю это.
Значит ли это, что мне нельзя объявлять дополнительные идентификаторы?

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

В разделе 7.1.3 стандарта C99 (Зарезервированные идентификаторы) мы можем прочитать:

  1. Все идентификаторы, начинающиеся с символа подчеркивания и либо с прописной буквы, либо с другого символа подчеркивания, всегда зарезервированы для любого использования.
  2. Все идентификаторы, начинающиеся со знака подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с областью действия файла как в обычном имени, так и в имени тега.

Хорошо, я не буду объявлять идентификатор с двойным подчеркиванием в начале или с одинарным подчеркиванием в начале, за которым следует заглавная буква.
Но как насчет второго правила, учитывая мой пример выше?


person Macmade    schedule 26.05.2014    source источник
comment
Область действия файла означает по существу глобальную, например _c99_math_isinf_f. Так что не используйте ведущие подчеркивания, в основном.   -  person Kerrek SB    schedule 26.05.2014
comment
@KerrekSB Большое спасибо за комментарий ... Я немного сбит с толку, так как думаю, что ответ Джаннеба имеет смысл. Есть мнение по этому поводу?   -  person Macmade    schedule 27.05.2014
comment
Что ж, немного сложно просто заявить, что вы являетесь частью реализации. Все сводится к условности, я полагаю.   -  person Kerrek SB    schedule 27.05.2014


Ответы (1)


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

В качестве примера этого правила в действии, если вы работаете в Linux, используйте «readelf -s» для проверки списков символов, скажем, glibc или libgcc. Вы найдете множество символов с двойным подчеркиванием в начале или с заглавной буквой в начале подчеркивания.

person janneb    schedule 26.05.2014
comment
Я не читал стандарт таким образом, отсюда и путаница, но теперь это действительно имеет смысл... Большое спасибо :) - person Macmade; 27.05.2014