C言語関係掲示板

過去ログ

No.1284 複数ヘッダーの関数宣言の違いによるmakeエラーへの対処

[戻る] [ホームページ]
No.16983

エラーについて
投稿者---yuji(2004/09/30 19:50:45)


make するとエラーがでちゃいます.
/usr/include/GL/glut.h:202:
declaration of 'void exit (int)' throws different exceptions

/usr/include/stdlib.h:578: than previous declaration 'void exit (int) throw ()'
がでてしまいます.
このエラーの意味がどうしてもわからなくて困っています.
解決策もわからなくて,なにかアドバイスもらえませんか?


No.16986

Re:エラーについて
投稿者---シャノン(2004/09/30 21:31:14)


>make するとエラーがでちゃいます.
>/usr/include/GL/glut.h:202:
>declaration of 'void exit (int)' throws different exceptions
>と
>/usr/include/stdlib.h:578: than previous declaration 'void exit (int) throw ()'
>がでてしまいます.
>このエラーの意味がどうしてもわからなくて困っています.
>解決策もわからなくて,なにかアドバイスもらえませんか?

exit の宣言が違うためでしょう。
glut.h では void exit( int ) と宣言され、
stdlib.h では void exit( int ) throw() と宣言されています。
前者は void exit( int ) throw( ... ) と同義ですから、
この相違から出ているメッセージだと思われます。

解決策は…どなたかバトンタッチ。


No.16987

Re:エラーについて
投稿者---tetrapod(2004/10/01 08:34:34)


> void exit (int) throw ()
は C++ 固有の関数宣言であり C の文法とは反しています。
# ISO/IEC14882:1998 3.6.1 には void exit(int); とあるため C++ 規格書にも反している
こんなヘンなことをやっている処理系(コンパイラ・OSの名称・バージョン) はなんでしょうか。
参考までに知りたいです。

解決策をいくつか考えてみました。
1.ソースコードを C++ ではなく C で書く
2./usr/include/stdlib.h 中の exit の宣言が C 互換になるようスイッチで細工
3./usr/include/GL/glut.h 中の exit の宣言が C++ 互換になるようスイッチで細工
4./usr/include/GL/glut.h 中で exit が宣言されないようスイッチで細工

スイッチで細工、とは、ヘッダファイルはたいてい
#if defined(HOGEHOGE)
void exit(int);
#else
void exit(int) throw();
#endif
のように #if 系で宣言がくくってあるので、その #if のスイッチ、
上記例では HOGEHOGE を自分で #define したり #undef したりすることを言います。

決して stdlib.h や glut.h を書き換えないでください。




No.16991

Re:エラーについて
投稿者---yuji(2004/10/01 10:53:35)


ありがとうございます.
一応,現在エラーの内容は理解できました.
>こんなヘンなことをやっている処理系(コンパイラ・OSの名称・バージョン) はなんでしょうか。
>参考までに知りたいです。
OS:RedHat7.0J
kernel2.2.16 です.
それで,質問したいのですが,glut.hはredhatのインストールの時点で入っていたのでしょうか?実は,僕は初心者でそれを確認することなく,OpenGL入門のHPからGLUTをインストールしてしまい,glut.hが書き換えられた可能性が高くて,この解決策が見つかりません.
方法として,インストールの2枚のCDからrpmでいれなおすのかなあと思ったのですが,
どのrpmにglut.hがはいっているのかわからずに、断念しています.

また,以下の方法が理解できないのですが?ヘッダを書き換えてはいけないのですか?
どのようにすればいいのでしょうか?
>スイッチで細工、とは、ヘッダファイルはたいてい
>#if defined(HOGEHOGE)
>void exit(int);
>#else
>void exit(int) throw();
>#endif
>のように #if 系で宣言がくくってあるので、その #if のスイッチ、
>上記例では HOGEHOGE を自分で #define したり #undef したりすることを言います。


No.16992

Re:エラーについて
投稿者---tetrapod(2004/10/01 11:31:24)


私も最近 Linux 追っかけしていませんので RH7.0J がどうなっているのかは知りません。

stdlib.h の当該行の前後を提示していただければ何とかなるかもしれません。



No.16993

Re:エラーについて
投稿者---yuji(2004/10/01 11:38:31)


>私も最近 Linux 追っかけしていませんので RH7.0J がどうなっているのかは知りません。
いろいろと質問しちゃってすみません.

>stdlib.h の当該行の前後を提示していただければ何とかなるかもしれません。
#ifdef __USE_ISOC99

extern void _Exit (int __status) __THROW __attribute__ ((__noreturn__));
#endif
となっています.
これでいいのでしょうか??


No.16994

Re:エラーについて
投稿者---yuji(2004/10/01 11:55:41)


いま,glut.hの
exitのところをコメントアウトしたら、同じエラーはでなくなりました.

この解決策ではとてもこわいのですが,なんとかこれで先に進みたいと思います.
ありがとうございました.


No.16995

Re:エラーについて
投稿者---nop(2004/10/01 12:44:10)


>いま,glut.hの
>exitのところをコメントアウトしたら、同じエラーはでなくなりました.
>この解決策ではとてもこわいのですが,なんとかこれで先に進みたいと思います.

>>決して stdlib.h や glut.h を書き換えないでください。

の一文は無視ですか?

# とりあえず、コメントアウトではなく、
# 「#include <glut.h>」などの前に#defineするのがよいでしょう。


No.16996

Re:エラーについて
投稿者---yuji(2004/10/01 12:58:17)


いいえ、無視していません.
まず、先に進めたいのでしかたなくやりました.
良い方法ではないですが、まずこの方法でいこうとおもってやりました.

OSをもう一度入れ直すことも考えて、やってます.
ので、stlib.hなどをかえました.
で,先ほどアドバイスいただいた4つくらいの方法を
僕より詳しいひとといっしょに試しましたが,うまくいかないので
こうしました


No.16997

Re:エラーについて
投稿者---yuji(2004/10/01 12:59:59)


追記
すみません.しっかり読んでいませんでした.

#defineでやります.
アドバイスありがとうございます.