Typedef числовых типов

#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:

Я не могу сказать, почему эта конкретная библиотека сделала это. Тем не менее, я сделал подобное в своей библиотеке, и я могу привести несколько причин, некоторые из которых вы уже упомянули:

  1. Это позволяет повысить кросс-платформенную переносимость без xintxx_t использования плавающих типов.
  2. Это позволяет вам менять типы местами — возможно, во время сборки. Например, если вы хотите иметь 3D-движок, который поддерживал бы как одинарную, так и двойную точность с плавающей запятой, вы можете объявить typedef float MyLibraryFloat; или typedef double MyLibraryFloat; запустить макрос define .
  3. Это может помочь абстракции библиотеки. Допустим, у вас есть библиотека, которая выступает в качестве интерфейса для нескольких разных библиотек с (в основном) совместимыми API. Абстрагирование типов может помочь в этом, хотя в данном случае это часто не так просто, как a typedef .

Я думаю, что лучшая причина — вторая. Это, безусловно, наиболее полезно, если вы имеете дело с ситуацией, когда ваши типы могут меняться в зависимости от настроек компилятора. Однако первое встречается часто, особенно в старых программах на Си. OpenGL / GLUT выполняет абстракцию типов для обеспечения безопасности размера.