プロが教える店舗&オフィスのセキュリティ対策術

以下のプログラムをg++とXL C++でコンパイルした場合に差異が生じており、困っています。
=========================================================
#include <stdio.h>
#include <stdlib.h>

class Abc
{
public:
Abc()
{
printf("コンストラクタCall\n");
}

void print()
{
printf("メソッドCall\n");
}
};

Abc abc;

int main()
{
abc.print();
return 0;
}
=========================================================
上記のようなソースの場合、g++でコンパイルしたものはメソッドがコールされる前にコンストラクタもコールされています。
しかし、XL C++でコンパイルするとコンストラクタはコールされるメソッドのみのコールとなります。

XL C++をg++の挙動と合わせたいのですが、コンパイル時のパラメータ設定等で解消できるものでしょうか?

御存知の方がいらっしゃいましたらよろしくお願い致します。

A 回答 (1件)

使ったことにないコンパイラなので言語仕様からの推測ですが、


もしかして確認手段の問題ではありませんか。

グローバル変数の初期化順という典型的な不定に起因していて、
「実際には両方ともコンストラクタが呼ばれている」が、
XL C++では、「コンストラクタが呼ばれた時点でまだ標準出力が準備できてない」ので、文字が表示されないだけなのではないでしょうか。
# まずprintfの戻り値を確認してみるとか、
# またはフラグなど別の手段で確認してみてください。

もしそうであれば、
・printfが単なる確認用で初期化は順不同でよいなら今のまま。
・順序に意味があるなら、グローバル変数のコンストラクタに順番を期待するのは間違いなので、グローバル変数を変える/コンストラクタを変える。
などで対応してください。
    • good
    • 0
この回答へのお礼

御返答ありがとうございます。

結論から言いますと、原因が分かりました。
コンパイラですが、xlcを使っていたのですがxlCを使う事で想定していた通りの結果が得られました。
お騒がせしました。

>「実際には両方ともコンストラクタが呼ばれている」が、
>XL C++では、「コンストラクタが呼ばれた時点でまだ標準出力が準備できてない」ので、文字が表示されないだけなのではないでしょうか。

こちらについては例ではprintfだけですが、実際は変数初期化等を行っていました。
しかし、xlcの場合は初期化されなかった為にその変数を使用したメソッドがバッファーオーバーフローを起こしてSegmentation Faultが発生した為、調べた所コンストラクタが呼ばれていない事に気づいた次第です。

ありがとうございました。

お礼日時:2009/08/07 13:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!