Clang 拡張 C++ コンパイラのエラーと警告
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++ コンパイラでは、このような代入を検知し、警告やエラーのメッセージを出力します。