1

次のコードを diab c++ コンパイラ (dplusplus) でコンパイルすると、3 行目で変換警告が生成されます。(&&) 演算子の結果を bool 以外にキャストすることで解決できます。

コード:

bool first = 1;
bool second = 1;
bool ret = (first && second); //generates compile warning

エラー:

警告: (etoa:1643): 縮小または符号付きから符号なしへの型変換が見つかりました: int から unsigned char へ

bool を別の型に定義しているものがないことを確認しました。これはコンパイラの問題のように見えますか、それともこれを引き起こす可能性のある何かが欠けている可能性がありますか?

4

1 に答える 1

2

Wind River の Web サイトは、Diab コンパイラが C または C++ のいずれかをコンパイルできることを示しています。

C では、&&演算子はint、値が0orの type の結果を返します1。これは、表示されている警告と一致しています。

1990 年の ISO 標準の時点で、C には組み込み型がありませんでしたboolbooltypedef として定義するのが一般的でした。boolの typedef であるメッセージからunsigned char、おそらくいくつかのヘッダーに表示されます。1999 年の ISO C 標準では、 と呼ばれる新しい事前定義されたブール型が追加されてい_Boolます。識別子は、 に展開されるマクロとしてbool定義されています。ただし、含まれていない場合は、他の方法で定義できます。<stdbool.h>_Bool<stdbool.h>bool

C++ では、値orを持つ&&type の結果を生成し、別個の基本型です。これは、少なくとも 1998 年の ISO C++ 標準以降は当てはまります。boolfalsetruebool

コードを C++ ではなく C としてコンパイルしているため、この警告が表示されている可能性が高いと思われます。可能性は低いですが、Diab コンパイラが C++ 標準に完全に準拠していない可能性があります。より厳密に適合するように指示する方法があるかもしれません。

Diab コンパイラは使用していません。通常、特定のファイル拡張子 (通常.cは C および.cppC++ の場合) を使用するか、別のコマンドを使用するか、またはその両方を使用して、コンパイルされる言語を制御できます。

適合する C++ コンパイラとして呼び出す方法については、コンパイラのドキュメントを参照してください。

実験として、コンパイラの呼び出し方法を変更する前に、次の宣言を追加してみてください。

int class;

ソースファイルに。これは C では有効ですが、C++ では構文エラーです (classは C++ キーワードであるため)。

アップデート:

OPは、彼が間違いなくCとしてではなくC++としてコンパイルしていると言っ&&intboolますunsigned char

警告は、コンパイラが準拠していないことを直接示しているわけではありません。コンパイラは、好きなことについて警告することができます。しかし、この警告の内容は、コンパイラのバグ、または少なくともどの C+ にも準拠していないコンパイラを示唆しています。

適合する C++ コンパイラは、このプログラムの診断を生成する必要があります。コンパイラは何をしますか? (ディレクティブは追加しないでください。)#include

int main() {
    class dummy { };         // Just to make sure it's C++
    bool b;
    unsigned char c;
    bool* pb = &c;           // Invalid conversion
    unsigned char* pc = &b;  // Invalid conversion
}

そして、このプログラムをコンパイルして実行すると、どのような出力が得られるでしょうか?

#include <iostream>
int main() {
    std::cout << "__cplusplus = " << __cplusplus << "\n";
}
于 2013-04-18T01:15:09.047 に答える