以下のプログラムを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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
[COBOL] ソースの復帰
-
実行ファイルが作成環境以外のP...
-
gcc コンパイル killed
-
実行後にコンパイルに失敗しま...
-
C#で char型とstring型の比較で...
-
CとC++の混在、最近は
-
WindowsXPの MinGW,コマンドラ...
-
すべてのリビルド: 0 正常、 0 ...
-
Linux(g++)とAIX(XL C++)の挙動...
-
ビープ音が鳴りません・・・
-
gcc バージョン違いによるコン...
-
再起動しないとADOが使えなくな...
-
この文章正確ですか?
-
ActiveFormの有無を判定したい
-
自作DLLの中身を暗号化
-
Visual Basic.NETの処理速度は6...
-
64bitで作ったdll32bit動かない
-
共有ライブラリの内容確認について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
すべてのリビルド: 0 正常、 0 ...
-
lhafileをインストールしたい
-
C#で char型とstring型の比較で...
-
gcc コンパイル killed
-
[COBOL] ソースの復帰
-
c言語です コンパイルした時に...
-
実行後にコンパイルに失敗しま...
-
共有ライブラリの内容確認について
-
ビープ音が鳴りません・・・
-
gcc バージョン違いによるコン...
-
64ビットのlinuxで32ビットメモ...
-
NASMとMASMの違い
-
C言語で作ったらWindowsでもMac...
-
math.hに含まれる関数が使えない
-
MVSマシンで0C7でABENDしたので...
-
ccとgcc
-
「インクルードファイル 'pthre...
-
自作DLLの中身を暗号化
おすすめ情報