以下のプログラムを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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 3×3のラテン方陣をつくるプログラムを作成したのですが、(↓) #include <stdio.h> 5 2023/07/10 01:53
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
c言語です コンパイルした時に...
-
ARDUINO <MsTimer2.h> にわかに...
-
math.hに含まれる関数が使えない
-
ccとgcc
-
C#で char型とstring型の比較で...
-
すべてのリビルド: 0 正常、 0 ...
-
PIC同士のシリアル通信について
-
strcpyが古い形式として宣言さ...
-
opencvのhighgui.hに書かれてい...
-
C言語をコンパイルするとコンピ...
-
logical '&&' with non-zero co...
-
g++コンパイルしながら使用され...
-
gccでc++プログラムをコンパイ...
-
C# exeファイルのダブルクリック
-
ビープ音が鳴りません・・・
-
UNIX上でdos.hをインクルード
-
ウィンドウを生成するには?
-
ifelseとswitch文
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
math.hに含まれる関数が使えない
-
C言語をコンパイルするとコンピ...
-
実行後にコンパイルに失敗しま...
-
ビープ音が鳴りません・・・
-
c言語です コンパイルした時に...
-
C#で char型とstring型の比較で...
-
すべてのリビルド: 0 正常、 0 ...
-
共有ライブラリの内容確認について
-
C言語で作ったらWindowsでもMac...
-
Verilog_HDLでのdefineとifdef
-
<math.h>ヘッダを入力している...
-
gcc コンパイル killed
-
64ビットのlinuxで32ビットメモ...
-
MVSマシンで0C7でABENDしたので...
-
[COBOL] ソースの復帰
-
プレコンパイルの意味を教えて...
-
libsshのコンパイルエラー
-
Visual Basic.NETの処理速度は6...
おすすめ情報