0

D言語の勉強をしながら、同時にCやC++言語との比較もやっています。dmdコンパイラもgdcコンパイラも問題なく動きますが、gccコンパイラでテストしたところ、ブール値のデフォルト初期化子であるGCCコンパイラのバグらしきものが見つかりました。次のコードを参照してください。

C++ コード

#include <iostream>
using namespace std;

int main()
{
    bool b;
    cout << b << endl;
    return 0;
}

G++ コンパイラ (gcc バージョン 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1):

g++ -Wall -pedantic test.cpp
test.cpp: In function ‘int main()’: test.cpp:7: warning: ‘b’ is used
uninitialized in this function 
./a.out 64

C コード (foo.c):

#include <stdio.h>
#include <stdbool.h>

#define bool _Bool

int main(int argc, char * args[])
{
    bool b;
    printf("%d\n", b);
    return 0;
}

gcc コンパイラ

gcc-4.6 -Wall -pedantic a.c
foo.c: In function ‘main’:
foo.c:9:8: warning: ‘b’ is used uninitialized in this function [-Wuninitialized]
./a.out
64

tcc コンパイラ

tcc -Wall foo.c
./a.out
0

クランコンパイラ

clang -Wall -pedantic foo.c     
./a.out
0

誰かがgccの動作を説明できますか?

4

2 に答える 2

6

警告メッセージが示すように、使用する前にローカル変数を初期化していないため、その内容は未定義になります。

于 2012-04-25T00:48:37.267 に答える
5

基本型の C++ でのデフォルトの初期化は、「初期化されていない」ことを意味します。つまり、任意の値が存在する可能性があります。たまたまそのメモリの場所にあったため、64 になりました。

値の初期化を行う場合は、次を使用する必要がありますbool()

bool b = bool(); //Now is false.

値の初期化は、事実上、基本型をゼロに初期化することを意味します。

C++11 はこれをかなりきれいにします:

bool b{}; //Now is false.
于 2012-04-25T00:58:17.753 に答える