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

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

9
#ifndef CLASS_Hと#define CLASS_Hを.hファイルで使用し、.cppでは使用しないのはなぜですか?
私はいつも人々が書くのを見てきました class.h #ifndef CLASS_H #define CLASS_H //blah blah blah #endif 問題は、クラス関数の定義を含む.cppファイルに対してもなぜそれを行わないのかということです。 のは、私が持っているとしましょう main.cpp、とmain.cpp含みclass.h。class.hファイルはしないincludeものは、そうはどのようmain.cppにあるか知っていますかclass.cpp?
136 c++ 

15
C ++での32ビットと64ビットの判別
C ++コードが32ビット対64ビットでコンパイルされているかどうかを確実に判断する方法を探しています。マクロを使用して合理的な解決策であると考えられるものを思いつきましたが、これが失敗する可能性のあるケースを人々が考えることができるかどうか、またはこれを行うより良い方法があるかどうか知りたいと思いました。これは、クロスプラットフォームの複数コンパイラ環境で実行しようとしていることに注意してください。 #if ((ULONG_MAX) == (UINT_MAX)) # define IS32BIT #else # define IS64BIT #endif #ifdef IS64BIT DoMy64BitOperation() #else DoMy32BitOperation() #endif ありがとう。


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 

8
C ++ビルドシステム-何を使用するか [閉まっている]
閉まっている。この質問はスタックオーバーフローのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善してみませんか?Stack Overflowのトピックとなるように質問を更新します。 4年前休業。 この質問を改善する 私はC ++で新しいプロジェクトを開始することを検討しています-最初は自分の時間内に-利用可能なビルドシステムを調査しています。答えは「たくさんあり、みんなひどい」と思われるでしょう。 これに特に必要な機能は次のとおりです。 C ++ 11サポート クロスプラットフォーム(メインターゲットとしてのLinuxですが、少なくともWindows上でもビルドできます) まともな単体テストのサポート コードを分離するための複数のモジュールのサポート コード生成のサポート(asn1cまたはprotobufの使用-まだ100%不明) メンテナンスが簡単 今では、CMakeとAutotoolsを使用して1〜4人で簡単にできることがわかっています。おそらく、SConsとWafと他のカップルもそうでしょう。問題は、それらを使用してコード生成を正しく行う方法を考えたことがないことです。つまり、ビルドプロセスが最初に実行されるまで存在しないソースファイルであるため、ビルドシステムが実行可能コードに変換できる必要があるソースファイルです。しかし、ビルドが開始するまでは実際にはわかりません...(特に、ASN1Cは、連携して動作する必要がある数十のヘッダーファイルとソースファイルを生成します。実際のファイルセットは、asnファイルの内容によって異なります)。また、これらのどれも特にメンテナンスが簡単ではないという事実-CMakeとAutotoolsには、動作するように管理する必要のある独自の巨大なスクリプトセットがあります。 それで、このようなものにはどのビルドシステムが推奨されますか?それとも私は今のところメイクファイルとシェルスクリプトで立ち往生していますか?
136 c++  build 

9
ワンショットの「if」を書く最もエレガントな方法
C ++ 17以降ifでは、次のように1回だけ実行されるブロックを記述できます。 #include <iostream> int main() { for (unsigned i = 0; i < 10; ++i) { if (static bool do_once = true; do_once) { // Enter only once std::cout << "hello one-shot" << std::endl; // Possibly much more code do_once = false; } } } 私はこれを考えすぎているかもしれないことを知っています、そしてこれを解決する他の方法がありますが、それでも-このようにこれを書くことは可能であるためdo_once = false、最後にの必要はありませんか? …
136 c++  if-statement  c++17 

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

16
delete []はどのようにしてそれが配列であることを認識しますか?
了解しました。渡された内容によっては、次のコードで何が起こるかは未定義であることに私たちは皆同意していると思います。 void deleteForMe(int* pointer) { delete[] pointer; } ポインタはあらゆる種類のものである可能性があるため、無条件delete[]で実行することは未定義です。ただし、実際に配列ポインターを渡しているとしましょう。 int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } 私の質問は、ポインターが配列であるこの場合、これを知っているのは誰ですか?つまり、言語/コンパイラの観点からarrは、配列ポインターか単一のintへのポインターかはわかりません。一体、arr動的に作成されたかどうかさえわかりません。しかし、代わりに次のようにすると、 int main() { int* num = new int(1); deleteForMe(num); return 0; } OSは、intを1つだけ削除し、そのポイントを超えて残りのメモリを削除することで、ある種の「強制終了」を行わないほどスマートです(それとstrlen、\0終端されていない文字列とは対照的です-それまでは続きます)ヒット0)。 では、これらのことを覚えておくことは誰の仕事なのでしょうか。OSは何らかのタイプの記録をバックグラウンドで保持しますか?(つまり、何が起きるかは未定義であると言ってこの投稿を始めたことを私は理解していますが、実際、「殺害酒宴」シナリオは発生しないため、実際の世界では誰かが覚えています。)


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

6
型消去テクニック
(型消去とは、Boost.Anyのように、クラスに関する型情報の一部またはすべてを非表示にすることを意味します。) 型消去の手法を手に入れながら、私が知っている手法を共有したいと思っています。私の希望は、誰かが彼/彼女の最も暗い時間に考えたいくつかのクレイジーなテクニックを見つけることです。:) 私が知っている、最初で最も明白で一般的に採用されているアプローチは、仮想関数です。クラスの実装をインターフェースベースのクラス階層内に隠すだけです。多くのBoostライブラリがこれを実行します。たとえば、Boost.Anyはこれを実行してタイプを非表示にし、Boost.Shared_ptrはこれを実行して(割り当て解除)割り当てメカニズムを非表示にします。 次にvoid*、Boost.Functionがファンクタの実際の型を非表示にするように、実際のオブジェクトをポインタに保持しながら、テンプレート化された関数への関数ポインタを持つオプションがあります。実装例は質問の最後にあります。 それで、私の実際の質問のために: あなたは他にどんなタイプの消去テクニックを知っていますか?可能な場合は、サンプルコード、使用例、それらについての経験、および詳細を読むためのリンクを提供してください。 編集 (これを回答として追加するか、質問を編集するだけか確信が持てなかったので、安全 な方法を実行します。)仮想関数や操作なしで何かの実際のタイプを非表示にするもう1つの優れた手法void*は、 1つのGManがここで採用しています。これがどのように機能するかについての私の質問に関連しています。 コード例: #include <iostream> #include <string> // NOTE: The class name indicates the underlying type erasure technique // this behaves like the Boost.Any type w.r.t. implementation details class Any_Virtual{ struct holder_base{ virtual ~holder_base(){} virtual holder_base* clone() const = 0; }; template<class …
136 c++  type-erasure 

5
C ++ 11の新しい構文「= default」
私はなぜこれをするのか理解できません: struct S { int a; S(int aa) : a(aa) {} S() = default; }; なぜただ言ってはいけない: S() {} // instead of S() = default; なぜそのための新しい構文を導入するのですか?
136 c++  c++11 

24
なぜ変数名が数字で始められないのですか?
私はしばらく前に新しいC ++開発者と一緒に作業していたとき、「なぜ変数名は数字で始められないのですか?」 一部の数値にテキストを含めることができること(123456L、123456U)を除いて、答えを思い付くことができませんでした。コンパイラがアルファ文字を含むすべてを変数名であると考えていた場合、それは不可能です。 それは正解でしたか?他に理由はありますか? string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

3
ラムダで並べ替える方法は?
sort(mMyClassVector.begin(), mMyClassVector.end(), [](const MyClass & a, const MyClass & b) { return a.mProperty > b.mProperty; }); インスタンスメソッドをバインドする代わりに、ラムダ関数を使用してカスタムクラスを並べ替えたいのですが。ただし、上記のコードではエラーが発生します。 エラーC2564: 'const char *':組み込み型への関数スタイルの変換は1つの引数しか取れません で正常に動作しboost::bind(&MyApp::myMethod, this, _1, _2)ます。
136 c++  sorting  lambda  char  const 

30
文字列がC ++の数値であるかどうかを判断する方法は?
文字列が数値であるかどうかをチェックする関数を作成するのにかなり苦労しました。私が書いているゲームの場合は、読み取っているファイルの行が数値であるかどうかを確認するだけです(この方法でパラメーターかどうかがわかります)。私はスムーズに機能していると思われる以下の関数を作成しました(または誤って編集して停止したか、統合失調症であるか、Windowsが統合失調症です)。 bool isParam (string line) { if (isdigit(atoi(line.c_str()))) return true; return false; }
136 c++  visual-c++ 

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