Clang 拡張 C++ コンパイラのエラーと警告

提供: Appmethod Topics
移動先: 案内検索

Clang 拡張 C++ コンパイラ への移動


警告メッセージの制御

[すべての警告を有効化]オプション([プロジェクト|オプション...|C++ コンパイラ|警告ページ)をオンにすると、コンパイラは -Weverything スイッチを指定して起動されます。このスイッチは -Wall("回避しやすい" 警告をすべて有効化)のスーパーセットです。

警告は個別に有効化または無効化できますが、それには警告の名前が必要になります。 これらの名前を表示するには、-fdiagnostics-show-option をコンパイラに渡します。 その結果、次のような警告は、

File1.cpp:32:11: warning: unused variable 'foo'

以下のように変わります。

File1.cpp:32:11: warning: unused variable 'foo' [-Wunused-variable]

その後は、-Wunused-variable を使用して、その特定の警告だけを有効にすることができます。 その警告を無効にするには、先頭に付く -W-Wno- に置き換え、目的とする警告レベルを有効にする際に使用するオプションと組み合わせて指定します。 例: -Wall -Wno-unused-variable では、未使用の変数に関する警告を除くすべての回避しやすい警告が有効になります。

BCC32 版からの移植でよく発生するエラー

BCC32 版から移植されたコードでは、以下のエラーが発生する可能性があります(アルファベット順、プレースホルダ(x)は無視します)。

'x' が値を参照していません(テンプレート内にて)

テンプレート パラメータによって決まる型名については、先頭に typename を付ける 必要があります。付いていない場合、例えば次のような場合:

template <class T>
void doSomething() {
  T::member *var;
}

ポインタ宣言のつもりの * が、実際には、乗算として解釈されてしまいます。そして、該当する変数がすでにスコープ内にある場合、型名(この例の場合、'member')を、値ではないのに乗算しようとして、このエラーが発生します。

依存型名 'x' の前に 'typename' がありません

テンプレート パラメータによって決まる型名については、先頭に typename を付ける必要があります。 省略された場合、極端な例では他のエラーを生成しますが、概してエラーと解決法は分かりやすいでしょう。

形成された 'x' を貼り付けています。無効なプリプロセッサ トークンです

プロセッサの ## 演算子での、トークンの貼り付け では、単一の有効なトークンを形成しなければなりません。 多くの場合、そもそも演算子は必要ないので、これをシンプルに削除することで問題を解決することができます。

パブリック シンボル 'x' がモジュール A と B の両方に定義されています

例:

[ilink64 Error] Error: Public symbol 'triplet::sum' defined in both module C:\USERS\WIN764\NODES.O and C:\USERS\WIN764\UNIT1.O

静的データ メンバは、ヘッダーで宣言し、(ヘッダーではなく)ソース ファイルで定義しなければなりません(定義は 1 回だけ)。

ILINK64 のドキュメント「ILINK64.EXE - 64 ビット インクリメンタル リンカ」も参照してください。。

宣言されていない識別子 'x' が使われています(テンプレート内で)

テンプレートにおける2 段階の名前ルックアップのため、規定クラスにある識別子は、this-> で修飾されない限り、解決されません。

テンプレート パラメータによって決まる型名については、先頭にtypenameを付ける必要があります。 付いていない場合、例えば次のような場合:

template <class T>
void doSomething() {
  T::member *var;
}

ポインタ宣言のつもりの * が、実際には、乗算として解釈されてしまいます。そして、該当する変数がすでにスコープ内にあるのでなければ、テンプレート値を宣言されていない識別子(この例の場合、'var')で乗算しようとして、このエラーが発生します。

BCC32 版からの移植でよく発生する警告

BCC32 版から移植されたコードでは、以下の警告(アルファベット順)のいくつかが発生するおそれがありますが、これらは無効にしてもかまいません。

文字列リテラルから 'char *' への変換は推奨されていません

-Wdeprecated-writable-strings

普通の char ポインタをリテラル C 文字列に代入することは推奨されません。 ポインタを const にします(さらに、適切であれば、std::string の使用を検討してください)。

暗黙の変換によって符号の有無が変化します

-Wsign-conversion

BCC32 は、signed から unsigned への代入を無視します。 Clang ベースの C++ コンパイラでは、このような代入を検知し、警告やエラーのメッセージを出力します。

関連項目