Linux(g++)とAIX(XL C++)の挙動の違いについて

このQ&Aのポイント
  • Linux(g++)とAIX(XL C++)で同じプログラムをコンパイルした場合、コンストラクタの呼び出しタイミングに差異がある。
  • g++ではメソッドの呼び出し前にコンストラクタも呼び出されるが、XL C++ではメソッドの呼び出しのみが行われる。
  • XL C++の挙動をg++と合わせるためには、コンパイル時のパラメータ設定が必要となる可能性がある。
回答を見る
  • ベストアンサー

Linux(g++)とAIX(XL C++)の挙動の違いについて

以下のプログラムを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++の挙動と合わせたいのですが、コンパイル時のパラメータ設定等で解消できるものでしょうか? 御存知の方がいらっしゃいましたらよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

使ったことにないコンパイラなので言語仕様からの推測ですが、 もしかして確認手段の問題ではありませんか。 グローバル変数の初期化順という典型的な不定に起因していて、 「実際には両方ともコンストラクタが呼ばれている」が、 XL C++では、「コンストラクタが呼ばれた時点でまだ標準出力が準備できてない」ので、文字が表示されないだけなのではないでしょうか。 # まずprintfの戻り値を確認してみるとか、 # またはフラグなど別の手段で確認してみてください。 もしそうであれば、 ・printfが単なる確認用で初期化は順不同でよいなら今のまま。 ・順序に意味があるなら、グローバル変数のコンストラクタに順番を期待するのは間違いなので、グローバル変数を変える/コンストラクタを変える。 などで対応してください。

h_urasam
質問者

お礼

御返答ありがとうございます。 結論から言いますと、原因が分かりました。 コンパイラですが、xlcを使っていたのですがxlCを使う事で想定していた通りの結果が得られました。 お騒がせしました。 >「実際には両方ともコンストラクタが呼ばれている」が、 >XL C++では、「コンストラクタが呼ばれた時点でまだ標準出力が準備できてない」ので、文字が表示されないだけなのではないでしょうか。 こちらについては例ではprintfだけですが、実際は変数初期化等を行っていました。 しかし、xlcの場合は初期化されなかった為にその変数を使用したメソッドがバッファーオーバーフローを起こしてSegmentation Faultが発生した為、調べた所コンストラクタが呼ばれていない事に気づいた次第です。 ありがとうございました。

関連するQ&A

  • C++の関数をfortranから呼びたい。(g++, g77)

    C++の関数をfortranから呼びたい。(g++, g77) いつもお世話になっています。 現在WindowsXPにMinGWというソフトを入れて C++のコンパイルはg++を Fortranのコンパイルはg77を 使用しています。 (いずれも動作は確認できています。) 現在、以下のようなソースを使用して fortranからC++関数を呼ぼうとしていますが できておりません。 ソース内容、コンパイル方法に問題があれば ご指摘頂きたくお願いします。 ■C++ソース #include <stdio.h> #include <iostream> extern "C" void funcHelloC_(); void funcHelloC_(void) { printf("hello C world!\n"); } ■fortranソース    write(*,*) "Hello Fortran World."    call funcHelloC()    end ※実際のソースの各文先頭には、半角スペース6つ分が  記述しています。 ■コンパイル手順 D:\C>g++ -c funcHelloC.cpp D:\C>g77 -c helloFortran.f D:\C>g77 helloFortran.o funcHelloC.o helloFortran.o(.text+0x51):helloFortran.f: undefined reference to `funchelloc_' funcHelloC.o(.text+0xd):funcHelloC.cpp: undefined reference to `_ZNKSs4sizeEv' funcHelloC.o(.text+0x60):funcHelloC.cpp: undefined reference to `_ZNKSsixEj' funcHelloC.o(.text+0x9e):funcHelloC.cpp: undefined reference to `_ZNKSsixEj' funcHelloC.o(.text+0xcc):funcHelloC.cpp: undefined reference to `_ZNKSsixEj' funcHelloC.o(.text+0x12f):funcHelloC.cpp: undefined reference to `_ZNSt8ios_base4InitC1Ev' funcHelloC.o(.text+0x14a):funcHelloC.cpp: undefined reference to `_ZNSt8ios_base4InitD1Ev'

  • linuxにおけるCの自作ヘッダファイル

    現在C言語のしっかりと学ばなかった部分を学習したいと思い、自作ヘッダファイルの作成を勉強しています。 そこで、書籍のその章を一通り読んだあと、自分で簡単なものを作成してみましたが、エラーが出てうまくいきません。 どうしてかわかる方いたら教えてください。 コード *****main.c***** #include "print.h" int main(void) { print(); return 0; } *****print.c***** #include <stdio.h> void print(void) { printf("test\n"); } *****print.h***** extern void print(void); エラー /tmp/ccH551c1.o: In function `main': /home/ユーザ名/Documents/StudyC/main.c:5: undefined reference to `print' collect2: ld returned 1 exit status CentOS6.6にて端末上での実行です。 自分の解釈では、""でincludeすることでカレントディレクトリから目的のヘッダファイルを見つけ出してインクルードする、また、ヘッダファイル内でexternすることによってprint.cから目的の関数を定義しているので、main.cでは問題なく使えると思っています。 しかし、エラーではprint()が定義されていないと出るのでまったくわかりません・・・。

  • strlen=がなかったら表示はどうなりますか!?

    #include <stdio.h> #include <string.h> int main() { char mojiretsu[10]; int nagasa; mojiretsu[0] = 'A'; mojiretsu[1] = 'B'; mojiretsu[2] = 'C'; mojiretsu[3] = '\0'; printf("%s\n", mojiretsu); nagasa = strlen(mojiretsu); printf("strlen=%d\n", nagasa); }  私のPCはgccプログラムがうまく働いていません 。   なのでコンパイル後の結果が分かりません。     以上のプログラム表示結果は参考書では    ABC strlen=3    です。  それで  "strlen=%d\n" を"%d\n"にしたら    表示結果は    ABC     3     となるのでしょうか!?  よろしくお願いします。  

  • 静的ライブラリについて教えて下さい

    静的ライブラリについて教えて下さい。作成方法は大体わかったのですが、使い方と利用シーンがわかりません。例えば、 -main.c- #include <stdio.h> #include "abc.h" int main(){ a(); b(); c(); } -a.c- #include <stdio.h> void a(void){ printf("a\n"); } -b.c- #include <stdio.h> void b(void){ printf("b\n"); } -c.c- #include <stdio.h> void c(void){ printf("c\n"); } -abc.h- void a(void); void b(void); void c(void); というファイルを作成した上で以下のようにコンパイルしました。 gcc -c a.c gcc -c b.c gcc -c c.c これで、a.o, b.o, c.oというオブジェクトファイルが出来ました。 次にar rcs static a.o b.o c.oとコマンドを打ったところ、問題なくstaticという静的ライブラリと思われるファイルが出来ました。で、そもそもですがこの使い方がわかりません。main.cをコンパイルする際に使うのでしょうか?そもそも上で作成した静的ライブラリにはmain.oも含めるべきものでしょうか?初歩的な質問ですみません。宜しくお願いします。

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • 対応する関数ヘッダーがありません

    最近Cを始めたばかりです。 コンパイルできなくて困ってます、意味がわかりません、 誰か教えてください。 #include <stdio.h> #include <process.h> { FILE *fp; int c; if ((fp=fopen("d:abc.txt","w"))==NULL){ printf("Can't open File\n"); exit(1); } while ((c=getchar())!=EOF) putc(c,fp); fclose(fp); } これをコンパイルしたら、 '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) などと言うエラーメッセージがでます、どうすればいいのか教えてください、なにぶん始めたばかりなので、わかり易くお願いします。

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • C言語、度々申し訳ございません。エラーです。

    いつも大変お世話になり誠にありがとうございます。 標記の件。 コードとコンパイルエラーを書きます。 度々すいません。 どうしたらいいでしょうか? ご回答の程宜しくお願い申し上げます。            高橋耕造 1.コード #include <studio.h> int main(void) { printf("%d\n",123); printf("\\100もらった\n"); printf("またあした\n"); return 0; } 2.コンパイルエラー C:\MinGW>gcc test2.c -o test2 test2.c:1:20: fatal error: studio.h: No such file or directory #include <studio.h> ^ compilation terminated. 検索しましたが解りません。 ご回答の程宜しくお願い申し上げます。

  • borlandについて

    こんばんは Borland C++ Compiler 5.5 を使っているのですが… _______________ |#include <stdio.h>      |←のようなプログラムをコンパイル |               | したら |int main(void) |1:インクルードファイル'stdio.h'を |{              | オープン出来ない | printf("Hello.\n");   |5:プロントタイプ宣言のない関数 | return 0;        | 'printf'の呼び出し(関数mein) |}              |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ と出てきますどうしたらよいでしょうか。

  • C言語 "myfunc.h"がエラーになります。

    いつも大変お世話になっております。 C言語に関する質問です。 "myfunc.h"の箇所がコンパイルエラーになります。 全体のコードとコンパイルエラーが下記です。 #include <stdio.h> #include "myfunc.h" int main(void) { int num1, num2, ans; printf("1番目の整数を入力してください。\n"); scanf("%d", &num1); printf("2番目の整数を入力してください。\n"); scanf("%d", &num2); ans = max(num1, num2); printf("最大値は%dです。\n" , ans); return 0; } コンパイルエラー C:\MinGW>gcc text13.c -o text13 text13.c:2:20: fatal error: myfunc.h: No such file or directory #include "myfunc.h" ^ compilation terminated. です。 ご多忙のところ恐れ入ります。 どこがおかしいのか、 ご回答のほどよろしくお願い申し上げます。

専門家に質問してみよう