#c #typedef
#c #typedef
Вопрос:
Я использую большой физический пакет Geant4 для запуска симуляций. В языке определено несколько typedef, которые используются исключительно во всем пакете.
typedef double G4double;
typedef float G4float;
typedef int G4int;
typedef bool G4bool;
typedef long G4long;
Я понимаю использование typedef для отображения числовых типов как типов, специфичных для домена, поскольку это улучшает читаемость и позволяет изменять typedef на более позднем этапе, если это необходимо. Однако в этом случае определения типов настолько широки, что они не служат этой цели.
Я также слышал о том, что typedef используются для обеспечения согласованного размера битов каждого типа, что sizeof(int)
не гарантируется стандартом. В данном случае этого не может быть, так как эти определения типов присутствуют всегда, а не генерируются скриптом после проверки размера рассматриваемого типа.
Какие еще могут быть цели, которые я упускаю из виду?
Ответ №1:
Некоторым библиотекам нравится делать это, чтобы поддерживать согласованность в своем коде. Все типы, которые они используют (даже примитивы), начинаются с G4
.
Теоретически вы могли бы переопределить их на определенных платформах, если размер какого-либо примитивного типа вызывает проблему.
Лично я никогда не слышал, чтобы кому-то нужно было это делать. Там, где требуются определенные размеры, они обычно используются в первую очередь. Но это не значит, что этого не произошло.
Ответ №2:
Я не могу сказать, почему эта конкретная библиотека сделала это. Тем не менее, я сделал подобное в своей библиотеке, и я могу привести несколько причин, некоторые из которых вы уже упомянули:
- Это позволяет повысить кросс-платформенную переносимость без
xintxx_t
использования плавающих типов. - Это позволяет вам менять типы местами — возможно, во время сборки. Например, если вы хотите иметь 3D-движок, который поддерживал бы как одинарную, так и двойную точность с плавающей запятой, вы можете объявить
typedef float MyLibraryFloat;
илиtypedef double MyLibraryFloat;
запустить макрос define . - Это может помочь абстракции библиотеки. Допустим, у вас есть библиотека, которая выступает в качестве интерфейса для нескольких разных библиотек с (в основном) совместимыми API. Абстрагирование типов может помочь в этом, хотя в данном случае это часто не так просто, как a
typedef
.
Я думаю, что лучшая причина — вторая. Это, безусловно, наиболее полезно, если вы имеете дело с ситуацией, когда ваши типы могут меняться в зависимости от настроек компилятора. Однако первое встречается часто, особенно в старых программах на Си. OpenGL / GLUT выполняет абстракцию типов для обеспечения безопасности размера.