問題タブ [g++5.1]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - g++-5.1.1 は、最適化フラグが使用されている場合にのみ、未使用の変数について警告します
大規模なプロジェクトで、リリース バージョン (最適化フラグを使用) をビルドするときのみ g++-5.1.1 からコンパイラ警告が表示されますが、デバッグ バージョン (ほとんどのコンパイラ最適化を無効にする) をビルドするときは表示されません。問題を再現するコマンドを使用して、以下にリストされている最小限の例に問題を絞り込みました。g++-4.8.4 を使用すると問題は発生しません。これは g++-5.1.1 のバグですか? それとも、このコードは正当に間違ったことを行っており、その警告を正当化していますか? コードにリストされている最後の 3 つのケースで警告が生成されないのはなぜですか (説明については、下部の編集を参照してください)。
興味のある方は、GCC の Bugzillaのバグ レポートをご覧ください。
編集: コメントで Ryan Haining が述べたように、container_2
リンケージcontainer_3
がextern
あり、コンパイラはそれらの使用について警告する方法がありません。
gcc - G++ 5.1 の `-Wctor-dtor-privacy` 警告は壊れていますか?
このctor-dtor-privacy
警告は、すべてのコンストラクタとデストラクタが private である場合にトリガーされることを意図しています。
したがって、次のクラスでは、警告がトリガーされると予想されます。
ただし、clang++
(バージョンclang 3.7.0 (trunk 238948)
) も GCC 5.1.0 も、 を使用する場合、このコードに対して警告を発行しません-Wctor-dtor-privacy
。これは疑わしいように見えますが、警告は完璧ではないため、いくつかの偽陰性が予想されると思います. (コピー コンストラクターとムーブ コンストラクターがまだ暗黙的に定義されているため、警告がトリガーされない可能性があります。そのため、技術的にすべてのコンストラクターがプライベートであるとは限りません。クラスを構築することはできません。)
ただし、このコードには警告が表示されます。
ここでtest
は、 が作成されprivate
、明示的なコンストラクターが削除されるため、foo
のコンストラクターが暗黙的に定義されます。G++ は次の警告を表示します。
clang++
警告を与えません。
暗黙の public コンストラクターがあるため、この警告は確かに正しくないようです。何が起きてる?これはバグですか?
編集:おそらくClang ++は警告を発行しないようです。次のクラスでも、警告は発生しません-Wctor-dtor-privacy
。
おそらく、この警告は単に G++ コマンドラインの互換性のために提供されているだけで、実際には何もしないのでしょうか? (このクラスは、GCC で非常に賢明な警告を生成することに注意してくださいwarning: ‘class ReallyTrulyPrivateOnly’ only defines private constructors and has no friends [-Wctor-dtor-privacy]
:)
編集 2:この警告の動作は十分に理解されておらず、文書化されておらず、この問題は発見され、バグ 55813で報告されていると思います。これはリリース 4.8 で「修正済み」とマークされましたが、動作がまだ怪しいと思われるため、この質問を指摘するコメントを追加しました。
EDIT 3:上記の編集のバグは同じ問題ではありません。この問題について、新しいバグ レポート (71484)を作成しました。
gcc - g++ 認識されないコマンド オプションを無視する
g++ では、認識されないコマンド ライン オプションを使用してパッケージをビルドすることはできません
この認識されないコマンド ライン オプションを許可するには、g++ が必要です。これは可能ですか?
編集
これは、自作の g++-5 を使用して可能ですか?
c++ - g++ 4.8.4 と g++ 5.3.1 の間で c_str() の寿命は変わりましたか?
上記のプロセスが継続的に実行され、適切な順序で開始されることを確認するデーモンからプロセスを開始します。
ある時点で、プロセスを開始したいexecv()
ので、引数用の文字列の配列を次のように準備します。
ほとんどの場合、そのような引数は 10 個ほどあります。
ここで、execv()
裸のポインターの配列にのみアクセスします。したがって、次のようにして、そのようなポインターの配列を作成します。
次にexecv()
、最後の配列で呼び出すことができます。
これは、g++ 4.8.4 を使用した Ubuntu 14.04 で完全に機能していましたが、どういうわけか、c_str()
g++ 5.3.1 でコンパイルされた同じコードを実行しようとすると、ポインターが無効になります。
execv()
私の理解では、ベアポインタの配列を作成する最初のループと呼び出しの間で文字列を変更していないため、これはそうではありません。
リファレンスには次のように書かれています。
c_str() から取得したポインターは、次の方法で無効にすることができます。
- 文字列への非 const 参照を標準ライブラリ関数に渡す、または
- operator[]、at()、front()、back()、begin()、rbegin()、end()、rend() を除く、文字列に対する非 const メンバー関数の呼び出し。
PS私はすでに修正を行っていstdup()
ますc_str()
。可能であれば、文字列の余分なコピーを1つ避けたいと思っていました...
g++ - dce R_X86_64_PLTOFF64 の再配置エラー
Direct Code Execution (DCE) - ネットワーク シミュレータ ns-3 の拡張機能で、偽の POSIX レイヤーを提供することでシミュレータ内で実際のプログラム (VLC、iperf) を実行できます - ubuntu へのアップグレード以来、成功していません。ゼニアル。DCE をコンパイルするには、最初にプログラムを実行./waf configure
し、最後にプログラムをビルドします。
これを修正するためのアイデアが不足していることを認めます。コンパイラをアップグレードしたときに最初に発生しました:
gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2)
詳細: https://github.com/direct-code-execution/ns-3-dce/issues/46
の結果は次のとおりです: ./waf build -v
https://transfer.sh/tj7uf/temp
そしてhttps://transfer.sh/qE5Cd/link-stepでの結果:
(R_X86_64_PLTOFF64 を検索)
何かヒントがあればお待ちしております
乾杯