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

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


7
64ビットWindowsのlongのビットサイズは何ですか?
少し前まで、誰かがlong64ビットマシンでは64ビットではないと言ってきましたint。私は常にを使用する必要があります。これは私には意味がありませんでした。long64ビットCPU向けにコンパイルすると、確かに64ビットであるというドキュメント(Appleの公式サイトにあるものなど)を見てきました。私はそれが64ビットWindowsで何であったかを調べて見つけました Windowsの場合:longとは、int長さが32ビットのままで、そして特殊な新しいデータ型は、64ビット整数のために定義されています。 (http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2から) 何を使うべきですか?Windowsではない場合uw、sw((un)signed width)のように定義する必要がありますかlong?それ以外の場合は、ターゲットCPUのビットサイズをチェックしますか?
137 c++  c  windows  64-bit  porting 



12
どのプラットフォームに8ビット文字以外のものがありますか?
時々、SOの誰かがchar(別名「バイト」)が必ずしも8ビットではないことを指摘します。 8ビットcharはほとんど普遍的なもののようです。主流のプラットフォームではchar、市場での実行可能性を確保するために8ビットが必要であると私は思っていました。 現在と歴史の両方で、どのプラットフォームcharが8ビットではないを使用していますか?なぜそれらが「通常の」8ビットと異なるのですか? コードを記述し、クロスプラットフォームサポート(たとえば、汎用ライブラリ)について考えるとき、8ビット以外のプラットフォームにどのような考慮を払う価値がありますcharか? 過去に、char16ビットのAnalog Devices DSPに出くわしました。DSPは、私が想定しているニッチなアーキテクチャのビットです。(そして、当時、手動でコード化されたアセンブラーは、利用可能なCコンパイラーができることを簡単に打ち負かしたので、そのプラットフォームでのCの経験はあまりありませんでした。)
136 c++  c  cross-platform 

9
C関数を名前変換できないのはなぜですか?
私は最近インタビューを受けました、そして尋ねられた一つの質問はextern "C"C ++コードで何が使用されているかということでした。Cは名前のマングリングを使用しないので、C ++コードでC関数を使用することだと答えました。Cが名前のマングリングを使用しない理由を尋ねられましたが、正直に答えることができませんでした。 C ++コンパイラーが関数をコンパイルすると、主にコンパイル時に解決する必要があるC ++で同じ名前のオーバーロードされた関数を使用できるため、関数に特別な名前が付けられることを理解しています。Cでは、関数の名前は同じままか、おそらくその前に_が付いています。 私のクエリは:C ++コンパイラがC関数を壊すことを許可することの何が問題になっていますか?コンパイラがそれらに付ける名前は問題ではないと私は思いました。CおよびC ++でも同じように関数を呼び出します。
136 c++  c  name-mangling  extern-c 

6
SwiftからCを呼び出す方法は?
SwiftからCルーチンを呼び出す方法はありますか? iOS / Appleライブラリの多くはCのみであり、それらを呼び出すことができるようにしたいと思います。 たとえば、Swiftからobjcランタイムライブラリを呼び出せるようにしたいと思います。 特に、iOS Cヘッダーをどのようにブリッジしますか?
136 c  swift 

8
GCC / G ++コンパイラで-pedanticを使用する目的は何ですか?
このメモは言う: -ansi:ANSI言語オプションを実装するようコンパイラーに指示します。これにより、ANSI標準と互換性のないGCCの特定の「機能」がオフになります。 -pedantic:と組み合わせて使用​​すると-ansi、ANSI標準に厳密に準拠するようコンパイラーに指示し、準拠していないコードはすべて拒否されます。 まず最初に: GCC / G ++コンパイラの-pedanticおよび-ansiオプションの目的は何ですか(上記の説明を理解できませんでした)? これらの2つのオプションを使用するための適切な状況を誰かに教えてもらえますか? いつ使うべきですか? それらは重要ですか?
136 c++  c  gcc  g++ 


4
「int main(vooid)」?それはどのように機能しますか?
最近、小さなCテストプログラムを入力する必要があり、その過程で誤ってのvooid代わりにを使用して、メイン関数のスペルミスを犯しましたvoid。 それでもまだ機能しました。 それを最小の完全版に減らして、私は次のようになりました: int main (vooid) { return 42; } これは確かにコンパイル(gcc -Wall -o myprog myprog.c)を行い、実行すると42を返します。 この有効なコードはどのくらい正確ですか? これが私のbashシェルから切り取って貼り付けた筆記録で、私がやっていることを示しています。 pax$ cat qq.c int main (vooid) { return 42; } pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq pax$ echo $? 42
135 c  syntax  main 

8
Cでの符号付きから符号なしへの変換-常に安全ですか?
次のCコードがあるとします。 unsigned int u = 1234; int i = -5678; unsigned int result = u + i; ここではどのような暗黙の変換が行われており、このコードはuとのすべての値に対して安全iですか?(安全です。この例の結果が巨大な正の数値にオーバーフローしても、それをintにキャストして実際の結果を得ることができるという意味です。)
135 c  type-conversion 


30
好きなCプログラミングトリックは何ですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 8年前に閉鎖。 ロックされています。質問はトピックから外れていますが、歴史的に重要であるため、この質問とその回答はロックされています。現在、新しい回答や相互作用を受け入れていません。 たとえば、私は最近、これをLinuxカーネルで見つけました。 / *条件が真の場合、コンパイルエラーを強制します* / #define BUILD_BUG_ON(condition)((void)sizeof(char [1-2 * !!(condition)])) したがって、コードで、たとえばいくつかのハードウェア制約のために、サイズが8バイトの倍数でなければならない構造がある場合は、次のようにすることができます。 BUILD_BUG_ON((sizeof(struct mystruct)%8)!= 0); また、構造体mystructのサイズが8の倍数でない限り、コンパイルされません。8の倍数の場合、ランタイムコードはまったく生成されません。 私が知っているもう1つのトリックは、1つのヘッダーファイルで1つのモジュールの変数を宣言および初期化しながら、そのモジュールを使用する他のモジュールで変数を宣言し、初期化するだけで、それらをexternとして宣言することです。 #ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL #define INIT(x、y)(x)=(y) #そうしないと #define GLOBAL extern #define INIT(x、y) #endif GLOBAL int INIT(x、0); グローバルint somefunc(int a、int b); これで、xとsomefuncを定義するコードは次のようになります。 #define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h" 一方、単にxとsomefunc()を使用しているコードは、次のことを行います。 #include "the_above_header_file.h" したがって、グローバルのインスタンスと関数プロトタイプの両方が必要な場所で宣言されている1つのヘッダーファイルと、対応するextern宣言を取得します。 それで、それらの線に沿ってあなたの好きなCプログラミングトリックは何ですか?
134 c 

3
このコードは、sizeof()を使用せずに配列サイズをどのように決定するのですか?
Cのインタビューの質問をたどると、「sizeof演算子を使用せずにCで配列のサイズを見つける方法は?」という質問があり、次の解決策が見つかりました。動作しますが、理由はわかりません。 #include <stdio.h> int main() { int a[] = {100, 200, 300, 400, 500}; int size = 0; size = *(&a + 1) - a; printf("%d\n", size); return 0; } 予想通り、5を返します。 編集:人々はこの答えを指摘しましたが、構文は少し異なります、すなわちインデックス方法 size = (&arr)[1] - arr; どちらの質問も有効で、問題へのアプローチが少し異なると思います。多大な助けと徹底した説明をありがとうございました!

9
再帰関数をインライン化できますか?
inline int factorial(int n) { if(!n) return 1; else return n*factorial(n-1); } 私がこれを読んでいたとき、上記のコードがコンパイラによって正しく処理されない場合、「無限コンパイル」につながることがわかりました。 コンパイラーは関数をインライン化するかどうかをどのように決定しますか?

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