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

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

13
std :: type_info :: nameの結果の展開
私は現在、とりわけ、呼び出し元の関数に関する情報を出力することになっているいくつかのロギングコードに取り組んでいます。これは比較的簡単なはずtype_infoです。標準のC ++にはクラスがあります。これには、typeidされたクラス/関数/などの名前が含まれます。しかし、それは壊れています。あまり役に立ちません。すなわちtypeid(std::vector<int>).name()戻りますSt6vectorIiSaIiEE。 これから何か有用なものを生み出す方法はありますか?同様にstd::vector<int>、上記の例のために。テンプレート以外のクラスでのみ機能する場合も問題ありません。 ソリューションはgccで機能するはずですが、移植できればより良いでしょう。これはロギング用であるため、オフにできないことはそれほど重要ではありませんが、デバッグには役立ちます。
93 c++  gcc  name-mangling 

7
POSIXファイル記述子からc ++ fstreamを構築する方法は?
私は基本的にC ++バージョンのfdopen()を探しています。私はこれについて少し調査しましたが、それは簡単なはずのように見えますが、非常に複雑であることがわかりました。私はこの信念に何か欠けていますか(つまり、本当に簡単です)?そうでない場合、これを処理するための良いライブラリがどこかにありますか? 編集:サンプルソリューションを別の回答に移動しました。


8
C ++では文字列の分割がPythonよりも遅いのはなぜですか?
少し速度を上げて、さびたC ++のスキルを磨くために、一部のコードをPythonからC ++に変換しようとしています。昨日、標準入力から行を読み取る単純な実装がPythonではC ++よりもはるかに高速だったときにショックを受けました(これを参照)。今日、ようやくC ++で文字列をマージ区切り文字(pythonのsplit()と同様のセマンティクス)で分割する方法を見つけ、deja vuを体験しました!私のC ++コードは、作業を実行するのにはるかに長い時間がかかります(昨日のレッスンの場合のように、1桁以上ではありません)。 Pythonコード: #!/usr/bin/env python from __future__ import print_function import time import sys count = 0 start_time = time.time() dummy = None for line in sys.stdin: dummy = line.split() count += 1 delta_sec = int(time.time() - start_time) print("Python: Saw {0} lines in {1} seconds. ".format(count, …

7
C ++では、なぜ__(ダブルアンダースコア)をそれほど多く使用するのですか?
私はいくつかのオープンソースのC ++コードを調べていましたが、コードで使用されているスコアの下で、主に変数名の最初に多くの二重のスコアがあることに気付きました。 return __CYGWIN__; これには理由があるのでしょうか、それとも単に一部の人々がコードスタイルをコーディングしているのでしょうか。読みにくくしていると思います。

2
CおよびC ++での+ =の結果は何ですか?
私は次のコードを持っています: #include <stdio.h> int main(int argc, char **argv) { int i = 0; (i+=10)+=10; printf("i = %d\n", i); return 0; } gccを使用してCソースとしてコンパイルしようとすると、エラーが発生します。 error: lvalue required as left operand of assignment しかし、g ++を使用してC ++ソースとしてコンパイルした場合、エラーは発生せず、実行可能ファイルを実行すると次のようになります。 i = 20 なぜ異なる動作ですか?
93 c++  c 

6
extern inlineは何をしますか?
私inlineはそれ自体がコンパイラへの提案であり、その裁量で関数をインライン化することもしないこともあり、リンク可能なオブジェクトコードも生成することを理解しています。 私static inlineは同じことをすると思いますが(インライン化してもしなくても)、インライン化するとリンク可能なオブジェクトコードを生成しません(他のモジュールがリンクできないため)。 写真のどこにextern inline収まるのですか? プリプロセッサマクロをインライン関数で置き換え、この関数をインライン化する必要があるとします(たとえば、呼び出し元に対して解決する必要がある__FILE__と__LINE__マクロを使用するため、この呼び出された関数ではないため)。つまり、関数がインライン化されない場合に備えて、コンパイラーまたはリンカーのエラーを表示します。extern inlineこれを行いますか?(そうでない場合は、マクロを使用する以外にこの動作を実現する方法はないと思います。) C ++とCの間に違いはありますか? コンパイラのベンダーとバージョンの違いはありますか?

2
C ++で[=]はどういう意味ですか?
何[=]が知りたい?これが短い例です template <typename T> std::function<T (T)> makeConverter(T factor, T offset) { return [=] (T input) -> T { return (offset + input) * factor; }; } auto milesToKm = makeConverter(1.60936, 0.0); []代わりにコードはどのように機能し[=]ますか? と思います std::function<T (T)> (T)引数として返され、型を返す関数プロトタイプを意味しますTか?
93 c++  c++11  lambda 

8
関数ポインターとしてのキャプチャーを備えたC ++ラムダ
私はC ++ラムダとそれらの関数ポインタへの暗黙の変換で遊んでいました。私の最初の例は、それらをftw関数のコールバックとして使用していました。これは期待どおりに機能します。 #include <ftw.h> #include <iostream> using namespace std; int main() { auto callback = [](const char *fpath, const struct stat *sb, int typeflag) -> int { cout << fpath << endl; return 0; }; int ret = ftw("/etc", callback, 1); return ret; } キャプチャを使用するように変更した後: int main() { vector<string> entries; …

9
編集したくないサードパーティのコードでgccから出てくる未使用の変数の警告を無効にするにはどうすればよいですか?
未使用の変数の警告をオフにするためにgccコンパイラーに渡すスイッチを教えてください。Windowsのブーストでエラーが発生し、ブーストコードに触れたくありません。 C:\boost_1_52_0/boost/system/error_code.hpp: At global scope: C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable] C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable] C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable] 両方-Wunused-valueを使用しようとしました-Wno-unused-valueが、どちらも上記のメッセージを抑制しませんでした。 正しいコマンドは何ですか、これが私のコンパイル行です: g++ -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion -Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated -IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE …

14
C ++でブールをテキストに変換する
多分これは馬鹿げた質問ですが、ブール値を文字列に変換して、1が「true」になり、0が「false」になるようにする方法はありますか?ifステートメントを使用することもできますが、言語または標準ライブラリでそれを行う方法があるかどうかを知っておくと便利です。さらに、私はペダントです。:)
93 c++  string  boolean 

5
C ++の悪い習慣でassert()を使用していますか?
リリースビルドのパフォーマンスに影響を与えずにデバッグを容易にするために、C ++コードに多くのアサーションを追加する傾向があります。これassertは、C ++メカニズムを考慮せずに設計された純粋なCマクロです。 一方、C ++はを定義しますstd::logic_error。これは、プログラムのロジック(したがって、名前)にエラーがある場合にスローされることを意図しています。インスタンスをスローすることは、の代わりに、C ++に代わる完璧な方法になる可能性がありますassert。 問題はassert、abort両方ともデストラクタを呼び出さずにプログラムをすぐに終了するため、クリーンアップをスキップするのに対し、例外を手動でスローすると、不要な実行時コストが追加されることです。これを回避する1つの方法は、独自のアサーションマクロを作成することです。これはSAFE_ASSERT、Cの対応物と同じように機能しますが、失敗すると例外をスローします。 この問題について3つの意見を考えることができます。 Cの主張に固執する。プログラムはすぐに終了するので、変更が正しく展開されるかどうかは問題ではありません。また、#defineC ++でsを使用することも同様に悪いことです。 例外をスローし、main()でキャッチします。コードがプログラムのどの状態でもデストラクタをスキップできるようにすることは悪い習慣であり、すべての犠牲を払って回避する必要があります。また、terminate()の呼び出しも同様です。例外がスローされた場合は、キャッチする必要があります。 例外をスローし、プログラムを終了させます。 プログラムを終了する例外は問題ありNDEBUGません。これにより、リリースビルドではこれが発生することはありません。キャッチは不要であり、内部コードの実装の詳細をに公開しmain()ます。 この問題に対する明確な答えはありますか?専門的な参考資料はありますか? 編集:デストラクタのスキップは、もちろん、未定義の動作ではありません。


4
タイプではないテンプレートパラメータ
型ではないテンプレートパラメータは定数積分式でなければならないことを理解しています。誰かが光を当てることができるのはなぜですか? template <std::string temp> void foo() { // ... } error C2993: 'std::string' : illegal type for non-type template parameter 'temp'. 定数積分式とは何かを理解しています。std::string上記のスニペットのように非定数型を許可しない理由は何ですか?
93 c++  templates 

16
C ++での循環シフト(回転)操作のベストプラクティス
左および右シフト演算子(<<および>>)は、C ++ですでに使用可能です。しかし、循環シフトまたは回転操作を実行する方法を見つけることができませんでした。 「左回転」「右回転」などの操作はどのように行うのですか? ここで2回右に回転 Initial --> 1000 0011 0100 0010 結果として: Final --> 1010 0000 1101 0000 例が参考になります。 (編集者注:Cで回転を表現する多くの一般的な方法は、回転カウントがゼロの場合、または単一の回転機械命令以上にコンパイルされる場合、未定義の動作の影響を受けます。この質問の回答は、ベストプラクティスを文書化する必要があります。)

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