しかし、私は自己促進のデータ型の意味を把握することができませんでした。彼らは何ですか&非自己昇進データ型とはどのように違いますか?自己推進のデータ型
答えて
ここにはC99 standardがあります。 「自己宣伝」型は、デフォルトの引数プロモーション(6.1.1.1項で説明した整数プロモーションを参照する§6.5.2.2パラグラフ6)が適用されるときに自らを促進するタイプです。
va_arg
定義(§7.15.1.1)を読むと、この制限がはであるということです。 [...]
または(デフォルト引数キャンペーンに による推進されるように)タイプは、実際の次の引数の型と互換性がない場合に...:関連部分は第2項です]昇格される実際の次の引数の型について非常に明確であるが、私はおよそタイプが推進されて何も言わないよう読ん
を。 (私は "(昇格された...)"節は、varargs関数が呼び出されたときに、引き続く引き数にデフォルトの引数昇格が実行されることを思い出させるものです)。
この項目は§ J.2この読み取りをサポートしてい
- 実際の次の引数、または実際次 引数の促進タイプと互換性がない 指定されたタイプとが存在しない場合
va_arg
マクロが起動され、一定と例外(7.15.1.1)。
(私は知っていますが、附属書Jは「規範的」ではなく「有益」です...)。場合
:va_arg(ap, float)
(たとえば)有効にすることはできません - その場合にタイプはfloat
であるが、実際の次の引数の促進タイプは、おそらく(float
引数はdouble
に昇格される)float
ことができません。
これはglibcの制限のようですが、C標準にはありません。
この背後にある考え方は、「変換ランク」、いわゆるいるという整数型であるint
よりも小さいが、自動的にsigned
またはunsigned
int
に昇格されています。 va_arg関数はそのようなより広い引数を見つけます。 va_arg
マクロは、まず、タイプint
のより広い引数を読んでから、元の型にキャストし直さなければなりません。
(同じことがdouble
へfloat
w.r.tについても同様である。)
気づいていないプログラマのために、これは驚くべき結果を持つことができるので、私は、これは避けるべきであるという考えに同意します。引用している説明は、小さなタイプを使用しないように強制されていることを暗示しているようです。これは偽物であり、私は標準と一致していないと言っています。一方、コードを書いた場合、これは制限で拡張ではないので、移植性の問題は決してありません。
私の知る限り、マシューは正しかったです。あなたは間違っています。この制限は少なくともC99では*です。それについて考えるなら、非常に難しいでしょう - 私は偽りはしませんが、Cの標準では、一般的には実装に難しい要求を単に置くことを避けています - "va_arg"の "従来の"実装を行う引数の宣伝が呼び出し元で行われる場合、この制限なしで、コンパイラ固有のものに展開されないもの)。 – zwol
@Zack:言葉遣いが少なくともあいまいであると言うと、「昇格した...」の範囲は明確ではありません。しかし、私は狭いタイプを許すことは実装に多大な負担をかけるとあなたに同意しません。彼らは狭い型をチェックし、型の宣言を読んで(実装はその型を見つける方法を知っていなければなりません)、値を狭い型にキャストする必要があります。 –
これはコンパイラの組み込み関数*から簡単に行うことができます。伝統的な 'va_arg'の実装は、そのような便利さにアクセスすることはできません。それは(技術的に定義されていない)コア言語表現ですべてを行います。 Cは型のメタプログラミングを行う方法を一切含んでいないので、あなたは "宣言された型の引数を見つけて、狭い型にキャストする"ことはできないと思います。 – zwol
- 1. 反応したネイティブの自己推論
- 2. 自動型推論
- 3. TypeScriptの自己参照型
- 4. メソッドの型シグネチャの型(自己)
- 5. データ型の16進
- 6. 自己完結型PHPサーバ
- 7. 自己ホスト型NetTcpサービスタイムアウトエラー
- 8. 自己評価型ラケットインタプリタ
- 9. 自己完結型JWT(オーソ)
- 10. 自己参照汎用型
- 11. SignalR - 自己ホスト型コンソールサーバ
- 12. 自己完結型ルビー "バイナリ"?
- 13. 自己ホスト型サーバーへの移行前にデータをクリーンアップする
- 14. が促進データ型
- 15. XSLT1.0自己参照型データをループする
- 16. 推進
- 17. 自己ホスト型SignalR + NancyFxの開発
- 18. 静的コンテキストでの自己型変数
- 19. 自己参加型LINQでのクエリ
- 20. 共変自己参照型の
- 21. 複数のWCFサービス(自己ホスト型)
- 22. 自己修復型MSIの診断
- 23. 自己ホスト型.NETコアコンソールアプリケーションのStartup.cs
- 24. 自己ホスト型マルチアカウントWebメールクライアントですか?
- 25. BigQuery "ビューは自己参照型です"
- 26. 自己完結型.netコアWebアプリケーション
- 27. Eager Loading自己参照多型協会
- 28. Docker内蔵自己完結型マイクロサービス
- 29. ジェネリック型の自己参照型のJavaサブクラス化問題
- 30. 自己回帰(AR)モデルのモデル次数を推定する
この制限は特にありませんか?おそらく 'va_arg'の実装と関係がありますか? –
@crypto:私はZackが正しいと思う(Jensに対する彼の反応を参照)。コンパイラからの特別な助けなしに与えられた型のデフォルト引数昇格を見つける明白な方法がないので、このような助けなしに動作する 'va_arg(ap、type) 'の実装が可能になります。 (例えば、 'ap'のスタック上の現在の引数にバイトポインタを置いておくと、' va_arg'はそれを 'type *'にキャストして次の引数に移動し、 'type *'ポインタをインクリメントして、バイトポインタにキャストし直します)。 –