なぜみんな標準C型よりもtypedefなのですか?


103

あなたが使用したい場合はQtのを、あなたは包含する必要がありquint8quint16等々と。

あなたが使用したい場合はGLibのを、あなたは歓迎していguint8guint16など。

のLinuxがあるu32s16などと。

uC / OSSINT32などUINT16を定義します。

そして、それらのいくつかの組み合わせを使用する必要がある場合は、トラブルに備えることをお勧めします。上なので、あなたのマシンがu32されるtypedef以上日間longquint32されるtypedef以上日間intとコンパイラが文句を言うでしょう

なぜ誰もがこれをしているのです<stdint.h>か?図書館にとってこれはある種の伝統なのでしょうか?


8
@Mehrdadのマイクロコントローラープログラミングでは、あらゆる種類のものを使用できます。例えばAVR Megaの(そしてその結果として有名なArduinoの)intは16ビットです。それは厄介な驚きかもしれません。私の意見では、「unsigned short」はより多くのタイピングの労力を必要とします。そして、<s> byte </ s>オクテットに「unsigned char」を使用すると、いつも悲しくなりました。署名されていないキャラクター、本当に?
Amomum

2
@Mehrdadポイントはあなたが本当に確信できないということです。それがまさに理由ですstdint.h発明されたです。
glglgl 2016

1
@glglgl:問題を確認する別の方法を次に示します。間違った質問をしていませんか?複数のシステムをターゲットにしている場合、そもそもなぜビット数をコードに任意にハードコーディングするのでしょうか。つまり、なぜsizeof(int) * CHAR_BIT(たとえば)言ってそれを使用しないのですか?int範囲を表すには小さすぎる場合(たとえば、配列インデックス)、ほとんどの場合、intとにかく使用すべきではありませんが、のようなものですsize_t。なぜint32これ以上意味があるのでしょうか?固定幅が理にかなっているだけで時間が...システム(例えば、ファイル/ネットワーク形式)の間の通信のためである
user541686

1
@Mehrdadいいえ。保存する必要のある値(ADCなどからの値)がある場合があります。私はそれらが16ビット幅であることを知っています。したがって、使用するのに最適なものはuint16_t(または多分そのfastまたはleastバリアント)です。私のポイント:これらのタイプは使用に便利であり、存在理由があります。
glglgl 2016

1
@Mehrdad:私は、高品質のコードを作成する価値があると思われる場合は、自分の関数型typedefを定義して、APIコードの残りの部分と対話する方法を定義し、技術的な観点からこれらを定義することをお勧めします。size_tおよび/のような「技術的な」typedef uint64_t
PJTraill 2016

回答:


80

stdint.hこれらのライブラリが開発されていたときは存在しませんでした。したがって、各ライブラリは独自typedefのを作成しました。


4
さて、私はstdint.hの欠如が正当な理由だと思いますが、今日でさえこれらのtypedefがintやlongなどであり、stdint型ではないのはなぜですか?それはそれらを少なくとも互換性のあるものにするでしょう
-Amomum

25
@Amomum「なぜGlib(Linuxで開発された)がLinux typedefを使用しなかったのですか?」glibの「ホームベース」は確かにLinuxですが、移植性のあるライブラリを設計することによっても同様です。独自のタイプを定義することで移植性が保証されます。ライブラリタイプを適切なそれぞれのターゲットプラットフォームタイプに一致させる小さなヘッダーを適合させるだけで済みます。
ピーター-モニカの復活2016

3
@Amomum なぜGlib(Linuxで開発されたのか)...いいえ、そうではありませんでした。口が達者で作成された道を Linuxカーネルの前に。
andy256 2016

5
@ andy256「GLib」は「glibc」の短縮形ではありません。これは、gtkから分岐したライブラリです。Linuxより古いものではありません。

2
@ andy256:glibは1998、linuxは1991です。IOW、GLibはLinuxのに作成されました。
MSalters

40

古いライブラリでは、問題のヘッダー(stdint.h)が存在しなかったため、これが必要です。

ただし、依然として問題があります。これらのタイプ(uint64_tおよびその他)は、標準のオプション機能です。したがって、準拠する実装はそれらに同梱されない可能性があります。したがって、ライブラリに現在でもそれらを含めるように強制します。


14
uintN_tタイプはオプションですが、uint_leastN_tuint_fastN_t種類はありません。
Kusalananda 2016

7
@Kusalananda:残念ながら、それらの有用性は限られています。
オービットでの軽さのレース2016年

16
もちろん、彼らはオプションであることの理由は、あなたがそこにいることを保証するものではありませんということであるビットのまさにその数の整数型は。Cは、やや奇数の整数サイズのアーキテクチャをサポートしています。
celtschk

5
@LightnessRacesinOrbit:それらの有用性は限られていますか?私はあなたがすべて自分の価値観が合うように確保するために、というだけの最小値よりビットの正確な数を、必要になる理由を離れてハードウェアインタフェースから、私は見ていないことを認めなければならない。
celtschk

23
@Amomum 実装が要件を満たす型を持つ場合、typedef 必須です。 2の補数表現で、対応するtypedef名を定義します。」(N1570、7.20.1.1 "正確な幅の整数型"からの引用)したがって、標準ライブラリにそれらがない場合、サードパーティのライブラリでもできなかったようです。
エリックMシュミット

13

stdint.h 多くのアプリケーションがタイプを定義(事実上エイリアス)して、基礎となるマシンアーキテクチャからの部分的な独立性を維持する可能性が高くなります。

これらは、アプリケーションで使用される型が、言語標準またはコンパイラー実装のいずれとも一致しない可能性のある動作に関するプロジェクト固有の前提条件に一致することを開発者に確信させます。

この実践は、オブジェクト指向のファサードデザインパターンに反映されており、インポートされたすべてのライブラリのラッパークラスを常に作成している開発者によって酷使されています。

コンパイラの標準がはるかに低く、マシンアーキテクチャが16ビット、18ビットから36ビットのワード長のメインフレームまで変化する可能性がある場合、これはより考慮すべき事項でした。32ビットのARM組み込みシステムに集中している世界では、この慣習はあまり重要ではありません。それは奇数のメモリマップを備えたローエンドのマイクロコントローラにとって依然として懸念事項です。


1
確かに、stdint.h1999年以来標準化されていますが、実際にはどれくらいの期間利用可能ですか?人々は足を引っ張って新しい標準を実装および採用します。その長い移行期間の間、古い方法は依然として必要です。
Siyuan Ren 2016

1
一つの厄介な落とし穴は、stdint.hそれが例えばプラットフォーム上でさえあるlongint32_t同じサイズ、同じ表現を持っている、キャストすることは要件がないint32_t*ためにlong*確実にアクセスすることができますポインタを得られますがint32_t。標準の作成者がレイアウト互換の型がエイリアス互換であることは明らかであるとは信じられませんでしたが、gccとIIRC clangの作成者はエイリアスを無視することで言語が改善されると考えているため、それが明らかな場合。
スーパーキャット2016

2
@supercat-それはおそらくC委員会に正誤表として提出する価値があります... それは穏やかに言えば、それは無意味に馬鹿げているからです
LThode

@LThode:C委員会が間違いとしてそれを公式にclangとgccの動作を鈍角として宣言する必要があることを認めるには それが起こると思いますか?期待できる最良の方法(およびIMHOの論理的な進め方)は、プログラムに「エイリアスモード」を指定する方法を定義することです。プログラムが非常に厳密なエイリアスルールを受け入れることができると指定している場合、コンパイラーはそれを使用して、現在可能な範囲を超えた最適化を可能にすることができます。プログラムが現在の規則よりもプログラマーにやさしい規則を必要とすることを指定している場合
supercat

...しかし、依然として多くの有用な最適化が可能であり、コンパイラーはで可能であるよりもはるかに効率的なコードを生成できますが-fno-strict-alias、実際には機能します。既存のコードベースがなかったとしても、アプリケーションごとにニーズが異なるため、すべてのアプリケーションの最適化とセマンティクスの最適なバランスを取る単一のルールセットはありません。既存のコードベースを追加すると、さまざまなモードの必要性が明確になります。
スーパーキャット2016

3

したがって、intにcharをtypedefする力があります。

「コーディングの恐怖」の1つは、ある企業のヘッダーに、プログラマーがブール値を必要とする点があり、charがジョブの論理的なネイティブ型であると述べたため、と書きましたtypedef bool char。その後、誰かが整数が最も論理的な選択であることを発見し、書いたtypedef bool int。その結果、ユニコード以前の時代は事実上typedef char intでした。

かなり多くの前向きな、前方互換性があると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.