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

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


12
/ proc / self / exeなしで現在の実行可能ファイルのパスを見つける
Linuxは/ proc / self / exeを使えば簡単だと思います。しかし、クロスプラットフォームインターフェイスを備えたC / C ++で現在のアプリケーションのディレクトリを見つける便利な方法があるかどうか知りたいのですが。argv [0]をいじくり回しているプロジェクトをいくつか見ましたが、完全に信頼できるとは思えません。 たとえば、/ proc /を持たないMac OS Xをサポートする必要がある場合、どうしますか?#ifdefsを使用して、プラットフォーム固有のコード(NSBundleなど)を分離しますか?または、argv [0]、$ PATHなどから実行可能ファイルのパスを推測しようとすると、エッジケースでバグを見つける危険がありますか?
190 c++  c  linux  macos  executable 

19
CまたはC ++でバイナリリテラルを使用できますか?
2進数を処理する必要があります。 私は書いてみました: const x = 00010000; しかし、それはうまくいきませんでした。 と同じ値を持つ16進数を使用できることはわかっていますが00010000、C ++に2進数用の型があるかどうか、ない場合は、問題の別の解決策がありますか?
190 c++  c  binary 

3
16進数のprintf()のフォーマット
これは重要な質問というよりは奇妙なクエリですが、16進数を先頭に0を付けた8桁の数値%#08Xとして出力すると、同じ結果が表示され0x%08Xないのはなぜですか。 前者を使用しようとすると、08フォーマットフラグが削除され、だけでは機能しません8。 再び私はただ気になった。
190 c  printf  hex 

11
負の数のモジュロ演算
Cプログラムで私は以下の操作を試みました(動作を確認するだけです) x = 5 % (-3); y = (-5) % (3); z = (-5) % (-3); printf("%d ,%d ,%d", x, y, z); (2, -2 , -2)gccのように出力しました。毎回良い結果を期待していた。係数は負にできますか?誰かがこの動作を説明できますか?
190 c  gcc  modulo 

6
なぜ配列のアドレスがCの値と等しいのですか?
次のコードビットでは、ポインタ値とポインタアドレスが予想どおりに異なります。 しかし、配列の値とアドレスはそうではありません! どうすればいいの? 出力 my_array = 0022FF00 &my_array = 0022FF00 pointer_to_array = 0022FF00 &pointer_to_array = 0022FEFC #include <stdio.h> int main() { char my_array[100] = "some cool string"; printf("my_array = %p\n", my_array); printf("&my_array = %p\n", &my_array); char *pointer_to_array = my_array; printf("pointer_to_array = %p\n", pointer_to_array); printf("&pointer_to_array = %p\n", &pointer_to_array); printf("Press ENTER to …
189 c  pointers  arrays 

25
次の2の累乗に切り上げ
次の2のべき乗の数を返す関数を書きたいのですが。たとえば、入力が789の場合、出力は1024になるはずです。ループを使用せずにビット演算子を使用するだけでこれを実現する方法はありますか?

13
Cはそれほど難しくありません:void(*(* f [])())()
今日は写真を見ただけで説明をいただければと思います。だからここに写真があります: 私はこれを混乱させ、そのようなコードがこれまでに実用的であるかどうか疑問に思いました。私は写真をグーグルで検索して、この redditエントリに別の写真を見つけました。ここにその写真があります。 それで、この「螺旋状に読む」は有効なものですか?これはCコンパイラの解析方法ですか? この奇妙なコードについて、より簡単な説明があればすばらしいでしょう。 すべてのほかに、これらの種類のコードは役に立ちますか?もしそうなら、いつ、どこで? 「スパイラルルール」についての質問がありますが、私はそれがどのように適用されるのか、またはそのルールで式がどのように読み取られるのかを尋ねているだけではありません。私はそのような表現の使用法とスパイラルルールの妥当性についても質問しています。これらについては、いくつかの良い答えがすでに投稿されています。

12
Cの可変個関数の呼び出しを転送する
Cでは、可変個関数の呼び出しを転送できますか?のように、 int my_printf(char *fmt, ...) { fprintf(stderr, "Calling printf with fmt %s", fmt); return SOMEHOW_INVOKE_LIBC_PRINTF; } 上記の方法で呼び出しを転送することは明らかにこの場合厳密には必要ありません(他の方法で呼び出しをログに記録したり、vfprintfを使用したりできるため)。 vfprintfと同様のヘルパー関数がない(および追加できない)。 [更新:これまでに提供された回答に基づいて、いくつかの混乱があるようです。質問を別の言い方で言うと、一般的に、関数の定義を変更せずに、任意の可変関数をラップできます。]
188 c  variadic 


5
constで変数を初期化しようとすると、「initializer element is not constant」エラーが発生する
次のプログラムの6行目(my_fooをfoo_initに初期化)でエラーが発生しましたが、その理由がわかりません。 typedef struct foo_t { int a, b, c; } foo_t; const foo_t foo_init = { 1, 2, 3 }; foo_t my_foo = foo_init; int main() { return 0; } これは、私が取り組んでいる大規模なマルチファイルプロジェクトの簡易バージョンです。目標は、オブジェクトファイルに単一の定数を含めることで、複数のファイルが状態構造を初期化するために使用できます。それは限られたリソースを備えた組み込みターゲットであり、構造体はそれほど小さくないので、ソースの複数のコピーは必要ありません。私は使用したくない: #define foo_init { 1, 2, 3 } また、移植可能なコードを記述しようとしているので、有効なC89またはC99のソリューションが必要です。 これはオブジェクトファイル内のORGに関係していますか?その初期化された変数は1つのORGに入り、2番目のORGの内容をコピーすることによって初期化されますか? 多分私は私の戦術を変更する必要があり、起動時にすべてのコピーを実行する初期化関数を持っている必要があります。そこに他のアイデアがない限り?
186 c  initialization 

3
fork()は予想以上に分岐しますか?
次のコードを考えてみましょう。 #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i = 0; i < 2; i++) { fork(); printf("."); } return 0; } このプログラムは、8つのドットを出力します。それはどのようにして可能ですか?代わりに6つのドットがあるべきではありませんか?
186 c++  c  fork 


1
GCCとg ++はどのようにブートストラップされますか?
これはしばらくの間私を悩ませてきました。GCCとg ++はどのようにコンパイルされますか? すべてのリビジョンが以前にビルドされたリビジョンでコンパイルされると思います。これは本当ですか?もしそうなら、最も古いg ++とGCCのバージョンがアセンブリで記述されたことを意味しますか?

14
インライン関数を使用する場合と使用しない場合
インラインはコンパイラへのヒントまたは要求であり、関数呼び出しのオーバーヘッドを回避するために使用されることは知っています。 それでは、関数がインライン化の候補であるかどうかをどのような根拠で判断できますか?どの場合、インライン化を避けるべきですか?
185 c++  c  inline 

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