タグ付けされた質問 「c99」

このタグは、国際標準ISO 9899:1999(別名「C99」)に関する技術的な正誤表に関する質問、およびC99で記述されたコードに関する質問(K&R C、C89以降の2011年改訂C11などのC標準改訂)に対するものです。 。


2
C99の「restrict」キーワードの現実的な使用法
私はいくつかのドキュメントと質問/回答を閲覧していて、それが言及されているのを見ました。私は簡単な説明を読み、基本的にはポインターが他の場所を指すために使用されないことがプログラマーからの約束であると述べました。 誰かが実際にこれを使用する価値があるいくつかの現実的なケースを提供できますか?
183 c  gcc  c99  restrict-qualifier 

10
GCCの## __ VA_ARGS__トリックの標準的な代替手段ですか?
C99の可変個引数マクロの空の引数に関するよく知られた 問題があります。 例: #define FOO(...) printf(__VA_ARGS__) #define BAR(fmt, ...) printf(fmt, __VA_ARGS__) FOO("this works fine"); BAR("this breaks!"); BAR()C99標準によれば、上記の使用は実際には正しくありません。 printf("this breaks!",); 末尾のコンマに注意してください-機能しません。 一部のコンパイラー(例:Visual Studio 2010)は、その末尾のコンマを静かに削除します。他のコンパイラ(例:GCC)##は__VA_ARGS__、の前に置くことをサポートしています。 #define BAR(fmt, ...) printf(fmt, ##__VA_ARGS__) しかし、この動作を実現するための標準準拠の方法はありますか?おそらく複数のマクロを使用していますか? 現在、##バージョンはかなりサポートされているようですが(少なくとも私のプラットフォームでは)、実際には標準に準拠したソリューションを使用します。 プリエンプティブ:小さな関数を書くことができることは知っています。マクロを使用してこれを実行しようとしています。 編集:BAR()を使用する理由の例(単純ですが)を次に示します。 #define BAR(fmt, ...) printf(fmt "\n", ##__VA_ARGS__) BAR("here is a log message"); BAR("here is a log message with a …


4
ブールから整数への変換
この変換はどの程度移植性がありますか。両方のアサーションがパスすることを確認できますか? int x = 4<5; assert(x==1); x = 4>5; assert(x==0); 理由は聞かないでください。私はそれが醜いことを知っています。ありがとうございました。
131 c++  c  c99 

3
以下のプログラムは、C89モードでコンパイルしたときに「C89」を出力し、C99モードでコンパイルしたときに「C99」をどのように出力しますか?
私はこのCプログラムをウェブから見つけました: #include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5//**/ -4.5))); return 0; } このプログラムの興味深い点は、C89モードでC89コンパイルおよび実行すると印刷され、C99モードでコンパイルおよび実行すると印刷されることC99です。しかし、私はこのプログラムがどのように機能するかを理解することができません。 printf上記のプログラムで2番目の引数がどのように機能するかを説明できますか?
128 c  printf  comments  c99  c89 

5
C、C99、ANSI C、GNU Cの違いは何ですか?
私はcodechefでプログラミングの練習を始めましたが、CとC99の違いに混乱しています。ここでCはどういう意味ですか?C89ですか?この送信の下部にある言語を確認してください。CとC99の両方が含まれています。 私はインターネット上でGNU Cと呼ばれるものを見つけました。linux/ unixシステム用の別のCはありますか?これらはANSIのC標準に準拠していますか?いくつかの場所で「C99 strict」も読んだことがあります。これは何ですか? 使用中の他のCの標準はありますか?C 4.3.2と呼ばれるものはありますか、それとも現在使用中のgccバージョンですか? 編集: これ、これ、これが役に立ちました。さらに検索して、未回答の項目を編集します。 私はプログラミングの初心者ではありません。C言語とは何か知っています。C89、C99、C11のようなANSIによる異なるC標準があることを知っています。
122 c  gcc  c99  c89  ansi-c 

5
C ++ 11がC99として指定された初期化リストをサポートしないのはなぜですか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 2年前休業。 この質問を改善する 考慮してください: struct Person { int height; int weight; int age; }; int main() { Person p { .age = 18 }; } 上記のコードはC99では合法ですが、C ++ 11では合法ではありません。 何でしたか c ++ 11 そのような便利な機能のサポートを除外するための標準委員会の理論的根拠?
121 c++  c  c++11  initialization  c99 


7
C99 stdint.hヘッダーとMS Visual Studio
驚いたことに、C99のstdint.hがMS Visual Studio 2003以降にないことがわかりました。彼らには理由があると確信していますが、誰がどこでコピーをダウンロードできるか知っていますか?このヘッダーがないと、uint32_tなどの有用な型の定義がありません。
113 c++  c  visual-studio  c99 

8
浮動小数点値の精度を維持するためのPrintf幅指定子
文字列をスキャンして戻すときに元の浮動小数点値が取得printfされるように、出力を必要な有効桁数に自動的にフォーマットする浮動小数点指定子に適用できる幅指定子はありますか? たとえば、floataを2小数点以下の精度で出力するとします。 float foobar = 0.9375; printf("%.2f", foobar); // prints out 0.94 出力をスキャンするとき0.94、元の0.9375浮動小数点値が返されることを保証する標準準拠の保証はありません(この例では、おそらくそうしません)。 に渡された元の値にスキャンして戻すことができるようにprintf、浮動小数点値を必要な有効桁数に自動的に出力する方法を教えてくださいprintf。 に渡す最大幅float.hを導出するためにいくつかのマクロを使用することができますprintfが、必要な有効桁数、または少なくとも最大幅に自動的に出力する指定子はすでにありますか?

12
Visual Studioは新しいC / C ++標準をサポートしていますか?
私はC99とC ++ 11と、いつか使うのが良いかもしれない言語標準に追加されているこれらすべての完全に甘いものについて読み続けています。ただし、現在Visual StudioでC ++を作成することは困難です。 標準の新しいものはビジュアルスタジオに追加されますか、それともMicrosoftは新しいC#バリアントを追加することに関心がありますか? 編集:受け入れられた回答に加えて、Visual C ++チームのブログを見つけました。 http://blogs.msdn.com/vcblog/ そして具体的には、その中のこの投稿: https://web.archive.org/web/20190109064523/https://blogs.msdn.microsoft.com/vcblog/2008/02/22/tr1-slide-decks/ 非常に便利。ありがとう!

3
「静的」または「extern」のない「インライン」は、C99でこれまで有用でしたか?
このコードをビルドしようとすると inline void f() {} int main() { f(); } コマンドラインを使用する gcc -std=c99 -o a a.c リンカエラーが発生します(への未定義の参照f)。エラーは、単にの代わりにstatic inlineまたはを使用した場合、またはコンパイルした場合に消滅します(そのため、関数は実際にはインライン化されています)。extern inlineinline-O この動作は、C99標準の6.7.4(6)項で定義されているようです。 変換単位内の関数のすべてのファイルスコープ宣言にinline関数指定子が含まれていないextern場合、その変換単位内の定義はインライン定義です。インライン定義は、関数の外部定義を提供せず、別の翻訳単位での外部定義を禁止しません。インライン定義は、外部定義の代替手段を提供します。トランスレーターは、同じ定義の関数への呼び出しを実装するために使用できます。関数の呼び出しでインライン定義を使用するか外部定義を使用するかは指定されていません。 これらすべてを正しく理解している場合inline、上記の例のように定義された関数を持つコンパイル単位は、同じ名前の外部関数もある場合にのみ一貫してコンパイルされ、自分の関数または外部関数が呼び出されるかどうかはわかりません。 この振る舞いは完全に行き詰まっていませんか?C99 inlineなしで、staticまたはexternC99で関数を定義することは、これまでに有用ですか?何か不足していますか? 回答のまとめ もちろん、私は何かを逃していた、そしてふるまいはふざけない。:) 以下のようニモを説明し、アイデアが入れてある定義関数のを inline void f() {} ヘッダーファイルと宣言のみ extern inline void f(); 対応する.cファイル内。extern宣言だけが、外部から見えるバイナリコードの生成をトリガーします。実際inline、.cファイルではは使用されていません。ヘッダーでのみ役立ちます。 以下のようジョナサンの答えの中で引用されたC99委員会の根拠 explicates、inlineコールのサイトに表示されるように関数の定義が必要なコンパイラの最適化についてのすべてです。これは、ヘッダーに定義を配置することによってのみ達成できます。もちろん、ヘッダー内の定義は、コンパイラーによって認識されるたびにコードを発行してはなりません。しかし、コンパイラーは実際に関数をインライン化する必要がないため、外部定義がどこかに存在している必要があります。
95 c  inline  c99 


3
sizeof(char)!= 1、または少なくともCHAR_BIT> 8のマシンはありますか?
OverаэтотвопросестьответынаStack Overflowнарусском:Кто-нибудьвстречалвсвоейпрактикеsizeof(char)!= 1? マシン(またはコンパイラ)はどこにありsizeof(char) != 1ますか? DOES C99標準では、と言っているsizeof(char)標準準拠の実装に正確に1でなければなりませんか?ある場合は、セクション番号と引用を教えてください。 更新: バイト(最小読み取りは4バイト、アラインメント済み)をアドレス指定できないマシン(CPU)があるが、バイトの4秒(uint32_t)のみの場合、このマシンのコンパイラーはsizeof(char)4に定義できますか? sizeof(char)1になりますが、charは32ビット(CHAR_BITマクロ)になります Update2: しかし、sizeof結果はバイトではありません!CHARのサイズです。そしてcharは2バイト、または(多分)7ビットにすることができますか? Update3:わかりました 。すべてのマシンが持っていsizeof(char) == 1ます。しかし、どのマシンにありCHAR_BIT > 8ますか?
93 c  char  standards  sizeof  c99 

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