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

Cは、システムプログラミング(OSおよび組み込み)、ライブラリ、ゲーム、クロスプラットフォームに使用される汎用プログラミング言語です。このタグは、ISO 9899標準で定義されているC言語に関する一般的な質問で使用する必要があります(特に指定のない限り、最新バージョン9899:2018。バージョン固有のリクエストには、c89、c99、c11などのタグも付けます)。CはC ++とは異なり、合理的な理由がない限り、C ++タグと組み合わせるべきではありません。


7
短絡論理演算子は必須ですか?そして評価順は?
ANSI規格では、CまたはC ++のいずれかで、論理演算子を短絡させることを義務付けていますか? あなたのコードは短絡されているこれらの演算に依存すべきではないと言っているK&Rの本を思い​​出して混乱しています。誰かが標準のどこで論理演算が常に短絡されていると言われているのか指摘してもらえますか?私は主にC ++に興味がありますが、Cの回答も素晴らしいでしょう。 私はまた、評価順序が厳密に定義されていないことを読んだことを思い出します(どこで思い出せないか)。したがって、コードは依存しないか、式内の関数が特定の順序で実行されると想定しないでください。呼び出されますが、コンパイラーは最も効率的な順序を自由に選択できます。 標準はこの式の評価順序を示していますか? if( functionA() && functionB() && functionC() ) cout<<"Hello world";


7
Cの列挙型のサイズは?
列挙値のセットを作成していますが、各列挙値は64ビット幅である必要があります。私が正しく思い出せば、列挙型は一般的にintと同じサイズです。(少なくともGCCでは)コンパイラが値を保持するために必要な任意の幅を列挙型にできることをどこかで読んだと思いました。それで、64ビット幅の列挙型を持つことは可能ですか?
140 c  enums 

5
Cのオブジェクトファイルとは
Cのライブラリについて読んでいますが、オブジェクトファイルの説明はまだわかりません。他のコンパイル済みファイルとオブジェクトファイルの実際の違いは何ですか? 誰かが人間の言語で説明できたらうれしいです。

9
なぜswitch文は中断を​​必要とするように設計されたのですか?
単純なswitchステートメントがあるとします switch (int) { case 1 : { printf("1\n"); break; } case 2 : { printf("2\n"); } case 3 : { printf("3\n"); } } ケース2にbreakステートメントがない場合、ケース3のコード内で実行が継続されることを意味します。これは偶然ではありません。そのように設計されました。なぜこの決定がなされたのですか?これには、ブロックの自動ブレークセマンティックを使用する場合と比べて、どのような利点がありますか?理論的根拠は何でしたか?
139 c  language-design 

11
古いCコンパイラの使用はセキュリティリスクですか?
私たちには、誰も気にしないいくつかのビルドシステムが本番環境にあり、これらのマシンはGCC 3やGCC 2のようなGCCの古いバージョンを実行しています。 そして私はそれをより新しいものにアップグレードするよう経営陣を説得することはできません:彼らは「壊れていなければそれを修正しないでください」と言います。 私たちは非常に古いコードベース(80年代に書かれた)を維持しているため、このC89コードはこれらのコンパイラーで問題なくコンパイルされます。 しかし、私はこれらの古いものを使うのが良い考えだとは思いません。 私の質問は: 古いCコンパイラを使用すると、コンパイルされたプログラムのセキュリティが低下する可能性がありますか? 更新: 同じコードがVisual Studio 2008 for Windowsターゲットによってビルドされ、MSVCはまだC99またはC11をサポートしていません(新しいMSVCがサポートしているかどうかはわかりません)。最新のGCCを使用してLinuxボックスでビルドできます。したがって、新しいGCCをドロップするだけで、おそらく以前と同じように正常にビルドされます。
139 c  security  gcc 

16
Cでクラスをどのように実装しますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 12か月前に閉鎖。 この質問を改善する C(C ++またはオブジェクト指向コンパイラーなし)を使用する必要があり、動的メモリ割り当てがない場合、クラスを実装するために使用できるテクニックは何ですか、またはクラスの適切な近似は何ですか?「クラス」を別のファイルに分離することは常に良い考えですか?固定数のインスタンスを想定するか、コンパイル時間の前に各オブジェクトへの参照を定数として定義することによっても、メモリを事前に割り当てることができると想定します。どのOOPコンセプトを実装する必要があるか(それはさまざまです)について自由に想定し、それぞれに最適な方法を提案してください。 制限: 組み込みシステム用のコードを書いているので、OOPではなくCを使用する必要があります。コンパイラと既存のコードベースはCにあります。 動的にメモリを割り当て始めた場合、メモリ不足にならないと合理的に想定できるほどの十分なメモリがないため、動的なメモリ割り当てはありません。 私たちが使用しているコンパイラは、関数ポインタに問題はありません
139 c  class  oop  embedded 

18
Linuxのitoa関数はどこにありますか?
itoa()数値を文字列に変換するための本当に便利な関数です。Linuxにはないようですitoa()が、同等の機能はありますsprintf(str, "%d", num)か、それとも使用する必要がありますか?
139 c  linux 

2
Cのシリアルポートを開いて読み書きする方法は?
シリアルポートへの読み書きについて少し混乱しています。LinuxにUSBデバイスがあり、FTDI USBシリアルデバイスコンバータードライバーを使用しています。プラグインすると、/ dev / ttyUSB1が作成されます。 Cで開いて読み書きするのは簡単だと思いました。ボーレートとパリティ情報はわかっていますが、これには標準がないようです。 何か不足していますか、それとも誰かが私を正しい方向に向けることができますか?
139 c  linux  serial-port 


12
gdbデバッガーの最もトリッキーで便利なコマンド[終了]
現在のところ、この質問はQ&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 gdbやdbxなどのデバッガーを実行しているときに、最もトリッキーで便利なコマンドを投稿できますか。
138 c  unix  gdb  debugging  dbx 

5
Linuxで書き込みが失われる原因となるI / Oエラーに対処するプログラムを作成する
TL; DR:LinuxカーネルがバッファリングされたI / O書き込みを失った場合、アプリケーションがそれを見つける方法はありますか? fsync()耐久性のためにファイル(およびその親ディレクトリ)を使用する必要があることを知っています。問題は、I / Oエラーが原因で書き込み保留中のダーティバッファーがカーネルで失われた場合、アプリケーションはこれをどのように検出して回復または中止できるでしょうか。 書き込みの順序と書き込みの持続性が重要になるデータベースアプリケーションなどを考えてください。 書き込みを忘れましたか?どうやって? Linuxカーネルのブロックレイヤーは、状況によっては、などによって正常に送信されたバッファリングされたI / O要求を失う可能性があり、次のようなエラーが発生します。write()pwrite() Buffer I/O error on device dm-0, logical block 12345 lost page write due to I/O error on dm-0 (end_buffer_write_sync(...)およびend_buffer_async_write(...)をfs/buffer.c参照)。 新しいカーネルでは、エラーには代わりに「失われた非同期ページ書き込み」が含まれます。 Buffer I/O error on dev dm-0, logical block 12345, lost async page write アプリケーションwrite()は既にエラーなしで返されているので、アプリケーションにエラーを報告する方法はないようです。 それらを検出しますか? 私はカーネルソースにそれほど精通していませんが、非同期書き込みを行っている場合、書き出されなかったバッファーに設定されると思いますAS_EIO。 set_bit(AS_EIO, &page->mapping->flags); …
138 c  linux  linux-kernel  posix 

2
C ++の初期割り当てがCの割り当てよりもはるかに大きいのはなぜですか?
同じコードを使用する場合、コンパイラーを(CコンパイラーからC ++コンパイラーに)変更するだけで、割り当てられるメモリの量が変わります。これがなぜなのかよくわからないので、もっと理解したいと思います。これまでのところ、私が得た最良の応答は「おそらくI / Oストリーム」です。これはあまり説明的ではなく、C ++の「使用しないものにお金を払わない」という側面について疑問に思います。 ClangコンパイラとGCCコンパイラのバージョン7.0.1-8と8.3.0-6をそれぞれ使用しています。私のシステムは最新のDebian 10(Buster)で実行されています。ベンチマークはValgrind Massifを介して行われます。 #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; } 使用されるコードは変更されませんが、CまたはC ++のどちらでコンパイルしても、Valgrindベンチマークの結果が変更されます。ただし、値はコンパイラ間で一貫しています。プログラムの実行時割り当て(ピーク)は次のようになります。 GCC(C):1,032バイト(1 KB) G ++(C ++):73,744バイト(〜74 KB) Clang(C):1,032バイト(1 KB) Clang ++(C ++):73,744バイト(〜74 KB) コンパイルには、次のコマンドを使用します。 clang -O3 -o c-clang ./main.c gcc -O3 -o c-gcc ./main.c clang++ -O3 -o cpp-clang ./main.cpp g++ -O3 …
138 c++  c  benchmarking 

3
Linuxで静的ライブラリをコンパイルする方法は?
質問:Linuxで静的ライブラリをでコンパイルする方法gcc、つまり、ソースコードをout.aという名前のファイルにコンパイルする必要があります。コマンドで単純にコンパイルするだけで十分gcc -o out.a out.cですか?私はに詳しくありgccません。誰かが私に手を貸してくれることを願っています。
138 c  gcc  static-libraries 

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