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

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

11
C / C ++で配列をコピーする機能はありますか?
私はC / C ++を学ぶJavaプログラマーです。したがって、JavaにはSystem.arraycopy()のような関数があることがわかります。配列をコピーします。配列をコピーする関数がCまたはC ++にあるかどうか疑問に思いました。forループ、ポインターなどを使用して配列をコピーする実装を見つけることしかできませんでした。配列をコピーするために使用できる関数はありますか?
92 c++  c  arrays 

9
なぜ一意の匿名型で言語を設計するのですか?
これは、C ++ラムダ式の機能として常に私を悩ませてきたものです。C++ラムダ式のタイプは一意で匿名であり、単に書き留めることはできません。構文的にまったく同じ2つのラムダを作成した場合でも、結果の型は異なるものとして定義されます。その結果、a)ラムダは、コンパイル時の無名型をオブジェクトと一緒に渡すことができるテンプレート関数にのみ渡すことができ、b)ラムダは、を介して型が消去された場合にのみ有用になりますstd::function<>。 わかりました、しかしそれはC ++がそれをする方法です、私はその言語のただの厄介な機能としてそれを書き留める準備ができていました。ただし、Rustが同じように見えることを知りました。各Rust関数またはラムダには一意の匿名型があります。そして今、私は疑問に思っています:なぜですか? だから、私の質問はこれです: 言語デザイナーの観点から、言語にユニークな匿名タイプの概念を導入することの利点は何ですか?

7
メンバー関数への関数ポインター
同じクラス内の別の関数へのポインターであるクラスのメンバーとして関数ポインターを設定したいと思います。私がこれをしている理由は複雑です。 この例では、出力を「1」にします。 class A { public: int f(); int (*x)(); } int A::f() { return 1; } int main() { A a; a.x = a.f; printf("%d\n",a.x()) } しかし、これはコンパイルに失敗します。どうして?

5
なぜこの構造体のサイズが2ではなく3なのですか?
私はこの構造体を定義しました: typedef struct { char A:3; char B:3; char C:3; char D:3; char E:3; } col; sizeof(col)私は3の出力を与えるが、それは2ではないでしょうか?1つの要素だけをコメント化するsizeofと、2になります。理由はわかりません。3ビットの5つの要素は15ビットに等しく、それは2バイト未満です。 このような構造を定義するときに「内部サイズ」はありますか?私の説明では、これまでの私の言語の概念から、サイズが3ではなく2バイトであると予想していたので、説明が必要です。
91 c++  c  struct 

3
最も負のint値は、あいまいな関数のオーバーロードに関するエラーを引き起こすのはなぜですか?
私はC ++での関数のオーバーロードについて学び、これに遭遇しました: void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; } int main() { int i = -2147483648; cout << i << endl; //will display -2147483648 display(-2147483648); } 私が理解したことから、int範囲(私の場合intは4バイト)で指定された値は呼び出されdisplay(int)、この範囲外の値はあいまいになります(コンパイラーが呼び出す関数を決定できないため)。これはint、最小値を除くすべての値の範囲、つまり-2147483648エラーでコンパイルが失敗する場合に有効です。 オーバーロードの呼び出しdisplay(long int)があいまいです しかし、同じ値をに取り、その値を出力するintと、になります2147483648。私は文字通りこの振る舞いに混乱しています。 この動作は、最も負の数が渡されたときにのみ観察されるのはなぜですか?(a shortが-32768- と一緒に使用された場合の動作は同じです。実際には、負の数と正の数が同じ2進数表現を持つ場合) 使用するコンパイラ:g ++(GCC)4.8.5

6
GCCでプリコンパイルされたヘッダー
誰もがGCCで動作するプリコンパイル済みヘッダーの取得に成功しましたか?私は私の試みで運がなかったし、それを設定する方法の多くの良い例を見たことがありません。私はcygwin gcc 3.4.4を試し、Ubuntuで4.0を使用しました。

2
演算子の優先順位以外に、余分な括弧はいつ効果がありますか?
C ++の括弧は多くの場所で使用されます。たとえば、関数の呼び出しやグループ化式で演算子の優先順位を上書きします。不正な余分な括弧(関数呼び出しの引数リストの周りなど)を除いて、C ++の一般的な(ただし絶対ではない)規則は、余分な括弧が害を及ぼすことはありません。 5.1一次式[expr.prim] 5.1.1一般[expr.prim.general] 6括弧で囲まれた式は、型と値が囲まれた式と同じである1次式です。括弧の存在は、式が左辺値かどうかには影響しません。括弧で囲まれた式は、別段の指示がない限り、囲まれた式を使用できるのとまったく同じコンテキストで、同じ意味で使用できます。 質問:基本的な演算子の優先順位を上書きする以外に、余分な括弧がC ++プログラムの意味を変更するのはどのコンテキストですか? 注:意味の異なる2つの構文を許可するのではなく、構文を制限するので、括弧なしのメンバーへのポインター構文の制限&qualified-idは範囲外と見なします。同様に、プリプロセッサマクロ定義内で括弧を使用すると、不要な演算子の優先順位を防ぐことができます。

9
一部のプラットフォームではchar **を使用し、他のプラットフォームではconst char **を使用するC ++関数を移植可能に呼び出すにはどうすればよいですか?
私のLinux(およびOS X)マシンでは、iconv()関数には次のプロトタイプがあります。 size_t iconv (iconv_t, char **inbuf... FreeBSDでは、次のようになります。 size_t iconv (iconv_t, const char **inbuf... C ++コードを両方のプラットフォームでビルドしたいと思います。Cコンパイラでchar**は、const char**パラメータに(またはその逆に)を渡すと、通常、単なる警告が発生します。ただし、C ++では致命的なエラーです。したがって、を渡した場合char**、BSDでコンパイルされません。渡した場合const char**、Linux / OS Xでコンパイルされません。プラットフォームを検出せずに、両方でコンパイルするコードを作成するにはどうすればよいですか? 私が持っていた1つの(失敗した)アイデアは、ヘッダーによって提供されたものをオーバーライドするローカルプロトタイプを提供することでした。 void myfunc(void) { size_t iconv (iconv_t, char **inbuf); iconv(foo, ptr); } これは、iconvCリンケージが必要なために失敗extern "C"し、関数内に配置することはできません(なぜでしょうか) 私が思いついた最良のアイデアは、関数ポインタ自体をキャストすることです。 typedef void (*func_t)(iconv_t, const char **); ((func_t)(iconv))(foo, ptr); しかし、これは他のより深刻なエラーを隠す可能性があります。
91 c++  const  portability 

12
ヘッダーファイルの変数宣言-静的かどうか
一部#definesをリファクタリングするときに、C ++ヘッダーファイルで次のような宣言に遭遇しました。 static const unsigned int VAL = 42; const unsigned int ANOTHER_VAL = 37; 問題は、静的である場合、どのような違いがあるかです。古典的な#ifndef HEADER #define HEADER #endifトリックのため、ヘッダーを複数含めることはできません(重要な場合)。 静的とVALは、ヘッダーが複数のソースファイルに含まれている場合に、1つのコピーのみが作成されることを意味しますか?
91 c++  c  static 


10
C ++での増分-x ++または++ xを使用する場合
私は現在C ++を学んでおり、インクリメントについて少し前に学びました。「++ x」を使用して前にインクリメントを行い、「x ++」を使用して後にインクリメントできることを知っています。 それでも、どちらを使用するかは本当にわかりません...「++ x」を実際に使用したことがなく、これまでのところ常に問題なく機能しているので、いつ使用するべきですか? 例:forループで、「++ x」を使用するのが望ましいのはいつですか? また、誰かがさまざまな増分(または減分)がどのように機能するかを正確に説明できますか?とても感謝しております。

5
C / C ++でポインター変数を宣言する正しい方法[終了]
現在のところ、この質問はQ&A形式には適していません。私たちは回答が事実、参考文献、または専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張された議論を誘います。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 9年前休業。 ポインタ変数の宣言に次の表記法を使用している人がいることに気づきました。 (a) char* p; の代わりに (b) char *p; (b)を使用します。表記(a)の背後にある合理的なものは何ですか?文字ポインタはそれ自体が型ではないため、表記(b)は私にとってより意味があります。代わりに、タイプは文字であり、変数は文字へのポインターである場合があります。 char* c; これはchar *型があり、変数cがその型であるように見えます。しかし、実際にはタイプはcharであり、* c(cが指すメモリ位置)はそのタイプ(char)です。複数の変数を一度に宣言すると、この違いが明らかになります。 char* c, *d; これは奇妙に見えます。cとdはどちらも、文字を指す同じ種類のポインタです。これで次のものはより自然に見えます。 char *c, *d; ありがとう。
91 c++  c  pointers  coding-style 

10
C / C ++アプリケーション用のオープンソースPDFライブラリ?[閉まっている]
閉まっている。この質問はスタックオーバーフローのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善してみませんか?Stack Overflowのトピックとなるように質問を更新します。 6年前休業。 この質問を改善する (ネイティブ)C ++ WindowsアプリケーションからPDF出力を生成できるようにしたいのですが。これを行うために利用できるフリー/オープンソースのライブラリはありますか? 私はこの質問への回答を見ましたが、それらは主に.Netに関連しています。
91 c++  c  pdf  open-source 

2
std :: stackがデフォルトでstd :: dequeを使用するのはなぜですか?
コンテナをスタックで使用するために必要な操作は次のとおりです。 バック() push_back() pop_back() なぜデフォルトのコンテナがベクターではなくデックなのですか? deque再割り当ては、front()の前に要素のバッファーを提供しないので、push_front()は効率的な操作です。これらの要素はスタックのコンテキストで使用されることがないため、無駄になりませんか? この方法でベクターの代わりに両端キューを使用するオーバーヘッドがない場合、priority_queueのデフォルトが両端キューではないベクトルでもあるのはなぜですか?(priority_queueには、front()、push_back()、およびpop_back()が必要です-基本的にスタックの場合と同じです) 以下の回答に基づいて更新: dequeが通常実装される方法は、固定サイズ配列の可変サイズ配列であるようです。これにより、ベクター(再割り当てとコピーが必要)よりも速く成長するため、要素の追加と削除をすべて行うスタックのような場合は、dequeの方が適しています。 priority_queueでは、削除と挿入を行うたびにpop_heap()またはpush_heap()を実行する必要があるため、インデックスの作成が必要になります。要素の追加はとにかく定数で償却されるので、これはおそらくそこでベクトルをより良い選択にします。
91 c++  stl  containers 

3
wtfはWTFですか?(WebKitコードベース)
私はChromiumのコードベースをダウンロードし、WTF名前空間を見つけました。 namespace WTF { /* * C++'s idea of a reinterpret_cast lacks sufficient cojones. */ template<typename TO, typename FROM> TO bitwise_cast(FROM in) { COMPILE_ASSERT(sizeof(TO) == sizeof(FROM), WTF_wtf_reinterpret_cast_sizeof_types_is_equal); union { FROM from; TO to; } u; u.from = in; return u.to; } } // namespace WTF これはどういう意味ですか?そうである可能性がありbitwise_castます。ここで指定された実装は、PODでない場合、TOまたはPODでなく、(AFAIK)組み込みのC ++よりも強力でFROMない場合はコンパイルされません。reinterpret_cast ここで私が目にする唯一の光のポイントはbitwise_cast、Chromiumプロジェクトで誰も使用していないようです。
91 c++  webkit  chromium 

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