問題タブ [gcc4.9]
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 - __atomic_exchange_n での不思議な「計算された値は使用されていません」という警告
gcc のアトミック ビルトインに基づいて再入可能関数を開発しました。残念ながら、「計算されたが使用されていない」値に関する不思議な警告が表示されます。
これは私の機能です:
なぜそれが起こるのですか?__atomic_exchange_n
何も計算しないでください。2 つの変数の内容を交換するだけです。
c - Glibc - ucontext.h でエラーが発生するが、-std=c11 のみ
私はこの最小限の helloworld を持っていますucontext.h
。
gcc-4.9 ( ) では、警告なしでコンパイルされますgcc -c hw.c -Wall
。
しかし、c11 標準 ( ) に切り替えるとgcc -std=c11 -c hw.c -Wall
、次のエラーが発生します。
私の最初の考えは、glibc は c11 をサポートしていないということです。そのためのグーグルは、有用な情報を明らかにしませんでした. ケースは何ですか?
(私は gcc-4.9 で glibc-2.19 を使用しています。これは debian jessie、amd64 です。)
gcc - brew install gcc49 on OS X 10.10 (使用可能な ISL が見つかりません)
をインストールしようとするとgcc49
、エラーが表示されます
しかし、私はISLを持っています:
どこにあるのかわかりませんconfig.log
。
c - ctype.h をインクルードせずにリンクできるのはなぜですか
- がない
#include<ctype.h>
場合、次のプログラムは 1 と 0 を出力します。 - インクルードすると、1 と 1 が出力されます。
TDM-GCC 4.9.2 64 ビットを使用しています。isdigit
最初のケースではの実装は何なのか、なぜリンクできるのだろうか。
c++ - リンカ マップ ファイルにはマングル シンボルが含まれている場合がありますが、常にそうであるとは限りません
ビルド プロセスの一環として、実行可能ファイルをコンパイルするときにマップ ファイルを生成します。例えば:
GCC 4.3/4.4 から GCC 4.9 に移行するために、新しいビルド サーバーをセットアップしました。4.9 ビルド サーバーによって生成されたマップ ファイルには、マングルされたシンボル名はありません。4.3/4.4 ビルド サーバーによって生成されたマップ ファイルはそうです。たとえば、上記を 4.3 で実行すると、マップ ファイルで次のように切り取られます。
4.9 に対して同じコードを実行すると、次のスニペットが得られます。
この変更は予想されますか? gcc 4.9 (ある種の下位互換性オプション) で破損した出力を生成する方法はありますか? 私たちのビルドの後のツールはシンボル ファイルを使用し、デマングルされた名前を詰まらせているためです。
c++ - gcc 4.8 を使用し、C++11 フラグを使用せずに C++ で正規表現を操作するにはどうすればよいですか?
私は最近、gcc 4.8 での正規表現サポートが不完全であり、gcc 4.9 で実際に実装されていることを知りました ( Is gcc 4.8 or older buggy about regular expressions?を参照してください)。
したがって、C++ プログラムで正規表現を使用したいので、この手順に従って gcc を 4.9 に更新しました ( https://askubuntu.com/questions/466651/how-do-i-use-the-latest-gcc-4- 9-on-ubuntu-14-04 )。
今、プログラムをコンパイルしようとすると#include <regex>
、コンパイラ フラグを指定する必要があると表示されますが-std=c++11
、これを実行しましたが、以前にはなかった新しいコンパイルの問題に直面しています ( ‘constexpr’ needed for in-class initialization of static data member
)。
それを考えると、今のところ gcc 4.8 に固執し、コンパイルで gnu++11 フラグを指定しないのが最善だと思います。正方形 1 に戻ります。
では、gcc 4.9 に切り替えたり、c++11 でコンパイラにフラグを立てたりしたくない場合、c++ で正規表現を使用できますか? 別の方法はありますか?
ありがとう!
PS: 実際には、gcc のバージョンではなく、コンパイルの問題を引き起こすのは c++11 フラグですよね?
c++ - コンパイラの最適化により遅延イテレータが壊れる
カスタム イテレータを使用してカスタム コンテナーを作成しました。コンテナーの特定の機能により、反復子は遅延評価する必要があります。質問のために、コードの関連部分は、このように実装された反復子の逆参照演算子です
イテレータ自体がテンプレートであるため、その関数はコンパイラによって自由にインライン化できます。
最適化を行わずにコードをコンパイルすると、期待どおりに戻り値が更新されます。リリース コンパイラの最適化 (GCC 4.9 では -O2) を使用すると、m_Current メンバーが変更可能としてマークされていても、最適化済みとしてマークした行がコンパイラによって最適化されることがあります。結果として、戻り値は反復子が指す値と一致しません。
これは予期される動作ですか? const とマークされていても、その関数の内容を評価する必要があることを指定する移植可能な方法を知っていますか?
質問が役立つほど網羅的であることを願っています。この場合、詳細が役立つかどうかアドバイスをお願いします。
編集:
1 つのコメントに答えるために、これは小さなテスト プログラムから取られた潜在的な使用法です。
テスト結果は、最後の 2 行を除くすべてのテストで期待どおりです
最適化をオンにすると、テストの最後の 2 行が壊れます。
このシステムは実際にうまく機能し、他のイテレーターほど危険ではありません。もちろん、コンテナーが彼の鼻の下で削除された場合は失敗します。参照を保持するだけでなく、コピーによって返された値を使用する方がおそらく安全ですが、これはトピックから外れています