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

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

6
Cの共有グローバル変数
Cで共有されるグローバル変数を作成するにはどうすればよいですか?ヘッダーファイルに入れると、リンカーは変数がすでに定義されていると文句を言います。私のCファイルの1つで変数を宣言し、externそれを使用したい他のすべてのCファイルの先頭に手動でsを配置する唯一の方法はありますか?それは理想的ではないようです。

12
CまたはC ++で構造体を返すのは安全ですか?
私が理解しているのは、これを行うべきではないということですが、このようなことを行う例を見たことがあると思います(コードは必ずしも構文的に正しいとは限りませんが、アイデアはそこにあります) typedef struct{ int a,b; }mystruct; そして、ここに関数があります mystruct func(int c, int d){ mystruct retval; retval.a = c; retval.b = d; return retval; } このようなことをしたい場合は、mallocされた構造体へのポインターを常に返す必要があることを理解しましたが、このようなことを行う例を見たことがあると確信しています。これは正しいです?個人的には、常にmallocされた構造体へのポインターを返すか、関数を参照してパスを実行し、そこで値を変更します。(私の理解では、関数のスコープが終了すると、構造を割り当てるために使用されたスタックはすべて上書きされる可能性があります)。 質問に2番目の部分を追加しましょう:これはコンパイラによって異なりますか?もしそうなら、デスクトップ用のコンパイラの最新バージョン(gcc、g ++、Visual Studio)の動作はどうなりますか? 問題についての考え?

16
Cの構造体メンバーのデフォルト値
一部の構造体メンバーにデフォルト値を設定することは可能ですか?次のことを試しましたが、構文エラーが発生します。 typedef struct { int flag = 3; } MyStruct; エラー: $ gcc -o testIt test.c test.c:7: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token test.c: In function ‘main’: test.c:17: error: ‘struct <anonymous>’ has no member named ‘flag’
82 c  struct 

9
OpenCVのcvWaitKey()関数は何をしますか?
の実行中に何が起こりcvWaitKey()ますか?いくつかの典型的なユースケースは何ですか?私はOpenCVリファレンスでそれを見ましたが、ドキュメントはその正確な目的について明確ではありません。
82 c++  c  opencv 

7
(なぜ)初期化されていない変数の未定義の動作を使用していますか?
私が持っている場合: unsigned int x; x -= x; この式の後でゼロになるx はずであることは明らかですが、私が見るところはどこでも、このコードの動作はx(減算の前まで)の値だけでなく、未定義であると言われています。 2つの質問: このコードの動作は本当に未定義ですか? (たとえば、準拠システムでコードがクラッシュする可能性がありますか?) もしそうなら、ここでゼロであるべきであることが完全に明らかであるのに、なぜCは動作が未定義でxあると言うのですか? つまり、ここで動作を定義しないことによって得られる利点は何ですか? 明らかに、コンパイラは、単に使用できるものは何でもそれは、変数内の「便利」とみなし、それが意図したとおりに動作します...そのアプローチと間違って何ガベージ値はありますか?

10
Cノンブロッキングキーボード入力
ユーザーがキーを押すまでループするプログラムをC(Linux上)で作成しようとしていますが、各ループを続行するためにキーを押す必要はありません。 これを行う簡単な方法はありますか?おそらくそれができると思いますがselect()、それは大変な作業のようです。 あるいは、非ブロッキングioの代わりに、プログラムが閉じる前にクリーンアップを行うためにctrl-cキーを押す方法はありますか?

12
16進文字列(char [])をintに変換しますか?
「0x1800785」などの値を含むchar []がありますが、値を指定する関数にはintが必要です。これをintに変換するにはどうすればよいですか?探し回ったのですが、答えが見つかりません。ありがとう。
82 c  char  int 

7
Cを使用したJSONの解析[クローズ]
閉まっている。この質問は、StackOverflowのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、スタックオーバーフローのトピックになります。 6年前に閉鎖されました。 この質問を改善する 私はCでJSONを解析するための良い方法を見つけようとしています。私は本当に巨大なライブラリなどを必要としません。むしろ、最小限の機能を備えた小さくて軽量なものが欲しいのですが、優れたドキュメントです。 誰かが私に指摘できるものはありますか?
82 c  json 

30
組み込み開発にC ++の代わりにCを使用する理由はありますか?
質問 ハードウェアC ++とC89に2つのコンパイラがあります クラスでC ++を使用することを考えていますが、ポリモーフィズムはありません(vtableを回避するため)。C ++を使用したい主な理由は次のとおりです。 マクロ定義の代わりに「インライン」関数を使用することを好みます。 プレフィックスがコードを乱雑にするので、名前空間を使用したいと思います。 C ++は、主にテンプレートと冗長なキャストのために、少しタイプが安全だと思います。 私はオーバーロードされた関数とコンストラクター(自動キャストに使用される)が本当に好きです。 非常に限られたハードウェア(4kbのRAM)向けに開発する場合、C89を使い続ける理由はありますか? 結論 あなたの答えをありがとう、彼らは本当に役に立ちました! 私は主題を熟考しました、そして私は主に以下のためにCに固執します: Cで実際のコードを予測する方が簡単です。これは、RAMが4kbしかない場合に非常に重要です。 私のチームは主にC開発者で構成されているため、高度なC ++機能はあまり使用されません。 Cコンパイラ(C89)で関数をインライン化する方法を見つけました。 あなたがたくさんの良い答えを提供したので、1つの答えを受け入れるのは難しいです。残念ながら、ウィキを作成して受け入れることができないので、私が最も考えさせられた答えを1つ選びます。
82 c++  c  embedded  c89 

11
uint_fast32_tよりもuint32_tが優先されるのはなぜですか?
それuint32_tよりもはるかに普及しているようですuint_fast32_t(これは事例証拠であると私は理解しています)。しかし、それは私には直感に反しているようです。 ほとんどの場合、実装の使用を見ると、uint32_t本当に必要なのは、最大4,294,967,295(通常は65,535から4,294,967,295の間のはるかに低い境界)の値を保持できる整数です。 その後、使用する奇妙なようだuint32_tとして、「正確に32ビットの」保証が必要とされていない、と「最速の利用可能> = 32ビット」の保証はuint_fast32_t正確に正しい考えているようです。さらに、通常は実装されていますが、uint32_t実際に存在することが保証されているわけではありません。 では、なぜそれuint32_tが好まれるのでしょうか。それは単によく知られているのですか、それとも他のものよりも技術的な利点がありますか?
82 c++  c  int 

7
Linuxは私のsyslogをどこに保存しますか?
ログファイルに何かを記録する簡単なテストアプリケーションを作成しました。私はlinuxmintを使用しており、アプリケーションの実行後、次のコマンドを使用してログを表示しようとしています。 tail -n 100 /var/log/messages しかし、ファイルメッセージはテストされたものでも何かでも存在しません。以下に私のコードがあります。何か間違ったことをしている、ファイルがそこに保存されていない、またはlinuxmintでログを有効にする必要があるかもしれません。 #include <stdio.h> #include <stdlib.h> #include <syslog.h> void init_log() { setlogmask(LOG_UPTO(LOG_NOTICE)); openlog("testd",LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); } int main(void) { init_log(); printf("Session started!"); syslog(LOG_NOTICE, "Session started!!"); closelog(); return EXIT_SUCCESS; }
82 c  linux  logging 

7
署名されたintではなくunsignedintを使用すると、バグが発生する可能性が高くなりますか?どうして?
ではGoogleのC ++スタイルガイド、「符号なし整数」のトピックに、それがあることが示唆されました 歴史的な事故のため、C ++標準では、コンテナのサイズを表すために符号なし整数も使用しています。標準化団体の多くのメンバーは、これは間違いだと信じていますが、現時点で修正することは事実上不可能です。符号なし演算は単純な整数の動作をモデル化せず、代わりにモジュラー演算(オーバーフロー/アンダーフローでラップアラウンド)をモデル化する標準によって定義されるという事実は、重要なクラスのバグをコンパイラーが診断できないことを意味します。 モジュラー演算の何が問題になっていますか?それはunsignedintの期待される振る舞いではありませんか? ガイドはどのようなバグ(重要なクラス)を参照していますか?バグがあふれていますか? 変数が負でないことを主張するためだけに符号なし型を使用しないでください。 unsignedintよりもsignedintを使用することを考えることができる理由の1つは、オーバーフローした場合(負の場合)、検出が容易になるためです。

6
CPUアーキテクチャのコンパイル時の検出
CまたはC ++コードをコンパイルするときにCPUアーキテクチャを見つけるための最も信頼できる方法は何ですか?私の知る限り、異なるコンパイラは、(非標準のプリプロセッサの定義の独自のセットを持っている_M_X86MSVSで、__i386__、__arm__GCCで、など)。 構築しているアーキテクチャを検出する標準的な方法はありますか?そうでない場合は、すべてのボイラープレートを含むヘッダーなど、さまざまなコンパイラーのそのような定義の包括的なリストのソースはあり#ifdefますか?

12
C / C ++での署名付きオーバーフローの検出
一見すると、この質問は整数オーバーフローを検出する方法の複製のように見えるかもしれません。ただし、実際には大幅に異なります。 符号なし整数オーバーフローの検出は非常に簡単ですが、C / C ++での符号付きオーバーフローの検出は実際にはほとんどの人が考えるよりも難しいことがわかりました。 それを行う最も明白でありながら素朴な方法は、次のようになります。 int add(int lhs, int rhs) { int sum = lhs + rhs; if ((lhs >= 0 && sum < rhs) || (lhs < 0 && sum > rhs)) { /* an overflow has occurred */ abort(); } return sum; } これに伴う問題は、C標準によれば、符号付き整数オーバーフローは 未定義の動作であるということです。 言い換えると、標準によれば、符号付きオーバーフローが発生するとすぐに、プログラムはnullポインターを逆参照した場合と同じように無効になります。したがって、上記の事後条件チェックの例のように、未定義の動作を引き起こして、事後にオーバーフローを検出しようとすることはできません。 上記のチェックは多くのコンパイラで機能する可能性がありますが、信頼することはできません。実際、C標準では符号付き整数オーバーフローは未定義であるとされているため、一部のコンパイラ(GCCなど)は上記のチェックを最適化します。、最適化フラグが設定されると、符号付きオーバーフローは不可能であると想定するため、を最適化します。これにより、オーバーフローをチェックする試みが完全に中断されます。 …

7
2D配列全体を1つの値で初期化する
次の宣言で int array[ROW][COLUMN]={0}; すべてゼロの配列を取得しますが、次の配列を使用します int array[ROW][COLUMN]={1}; すべて1つの値を持つ配列を取得しません。デフォルト値は0のままです。 なぜこの動作をし、どのようにすべて1で初期化できますか? 編集:memset値を1として使用すると、各バイトが1に設定されるため、各配列セルの実際の値は1ではなく16843009。になることを理解しました。1に設定するにはどうすればよいですか?

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