
以下のプログラムを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++の挙動と合わせたいのですが、コンパイル時のパラメータ設定等で解消できるものでしょうか?
御存知の方がいらっしゃいましたらよろしくお願い致します。
No.1ベストアンサー
- 回答日時:
使ったことにないコンパイラなので言語仕様からの推測ですが、
もしかして確認手段の問題ではありませんか。
グローバル変数の初期化順という典型的な不定に起因していて、
「実際には両方ともコンストラクタが呼ばれている」が、
XL C++では、「コンストラクタが呼ばれた時点でまだ標準出力が準備できてない」ので、文字が表示されないだけなのではないでしょうか。
# まずprintfの戻り値を確認してみるとか、
# またはフラグなど別の手段で確認してみてください。
もしそうであれば、
・printfが単なる確認用で初期化は順不同でよいなら今のまま。
・順序に意味があるなら、グローバル変数のコンストラクタに順番を期待するのは間違いなので、グローバル変数を変える/コンストラクタを変える。
などで対応してください。
御返答ありがとうございます。
結論から言いますと、原因が分かりました。
コンパイラですが、xlcを使っていたのですがxlCを使う事で想定していた通りの結果が得られました。
お騒がせしました。
>「実際には両方ともコンストラクタが呼ばれている」が、
>XL C++では、「コンストラクタが呼ばれた時点でまだ標準出力が準備できてない」ので、文字が表示されないだけなのではないでしょうか。
こちらについては例ではprintfだけですが、実際は変数初期化等を行っていました。
しかし、xlcの場合は初期化されなかった為にその変数を使用したメソッドがバッファーオーバーフローを起こしてSegmentation Faultが発生した為、調べた所コンストラクタが呼ばれていない事に気づいた次第です。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
math.hに含まれる関数が使えない
-
C#で char型とstring型の比較で...
-
すべてのリビルド: 0 正常、 0 ...
-
ヘッダーファイル『windows.h』...
-
アプリケーションのDLLファイル...
-
define文のパラメータを実行時...
-
gcc バージョン違いによるコン...
-
<math.h>ヘッダを入力している...
-
Squidのコンパイル時のオプショ...
-
return (0)の括弧は何故付ける
-
実行後にコンパイルに失敗しま...
-
共有ライブラリの内容確認について
-
EXEファイルの逆コンパイル
-
Visual studio2022 コンパイル...
-
OpenSSLについて。実行できませ...
-
Windowsでのスレッド間通信につ...
-
「逆コンパイル」ってできるん...
-
別々に作ったプログラムを繋げたい
-
[COBOL] ソースの復帰
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
[COBOL] ソースの復帰
-
math.hに含まれる関数が使えない
-
共有ライブラリの内容確認について
-
ビープ音が鳴りません・・・
-
c言語です コンパイルした時に...
-
C#で char型とstring型の比較で...
-
64ビットのlinuxで32ビットメモ...
-
C言語で作ったらWindowsでもMac...
-
すべてのリビルド: 0 正常、 0 ...
-
「インクルードファイル 'pthre...
-
<math.h>ヘッダを入力している...
-
vba コンパイル
-
gccでc++プログラムをコンパイ...
-
Fortran77 (intel fortran)
-
別々に作ったプログラムを繋げたい
-
プレコンパイルの意味を教えて...
-
fatal error LNK1112
おすすめ情報