Я ищу некоторые разъяснения по частям стандарта 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 (Зарезервированные идентификаторы) мы можем прочитать:
- Все идентификаторы, начинающиеся с символа подчеркивания и либо с прописной буквы, либо с другого символа подчеркивания, всегда зарезервированы для любого использования.
- Все идентификаторы, начинающиеся со знака подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с областью действия файла как в обычном имени, так и в имени тега.
Хорошо, я не буду объявлять идентификатор с двойным подчеркиванием в начале или с одинарным подчеркиванием в начале, за которым следует заглавная буква.
Но как насчет второго правила, учитывая мой пример выше?
_c99_math_isinf_f
. Так что не используйте ведущие подчеркивания, в основном. - person Kerrek SB   schedule 26.05.2014