1 :
デフォルトの名無しさん :
03/12/27 09:20
2 :
デフォルトの名無しさん :03/12/27 09:24
2ゲット
4 :
デフォルトの名無しさん :03/12/27 11:39
m9( `Д´)
5ゲット
>>7 先頭要素だけアラインメント指定を遵守して、ポインタ演算はアラインメント指定を
無視してくれてる模様。
11 :
デフォルトの名無しさん :04/01/02 11:04
今年はプリコンパイラが導入されますように。
ここを紹介されて来ました。マルチポストですみません。 gcc-3.3.1なのですが、ソースをコンパイルするとき-I./includeを付けると、 ソース中でインクルードしているpthread.hの内部で未定義エラーが でます。実際に-I./includeが必要であってもなくても、付けるだけでエラーが 出ます。もちろん、付けなければコンパイルは通ります。 エラーの原因はデフォルトの検索パスが無視されているため起こるようなの ですが、これを回避する方法はないでしょうか。 #問題の簡略化のため、このディレクトリは使用しないでいますが、本当は #必要なヘッダファイルがあるので使いたいのです。 $ gcc test.c -I./include -c In file included from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/include/pthread.h:664, from test.c:6: /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/include/bits/sigthread.h:41: error: 構文解析エラー before '*' token
14 :
デフォルトの名無しさん :04/01/04 21:12
>>13 includeのディレクトリがbinの中にあるの?
>>13 > エラーの原因はデフォルトの検索パスが無視されているため
../include にシステム標準のヘッダファイルと重複する名前のファイルが
置いてないか? あるいはファイル名は違っても、インクルードガードが
一致しているとか。
>>13 まさかね。gccは自分でソースからインスコしたものです。
ちなみに、TL8WSなので、元からあるgcc-2.96でも同じ現象が出ます。
>>16 レスサンクス。重複するファイルはありません。
ただ気付いたことといえば、crypt()なんかを使う場合、__USE_XOPENとか
unistd.hをインクルードする直前にdefineしなければ、undefされてしまう
ような、面倒くさい事象があるのには気付きました。(-Wallとか-Wシリーズ
のオプションを幾つも付けた場合に警告されるので分かる)
元々はこっちにポストしてました。
http://pc2.2ch.net/test/read.cgi/tech/1072212403/658-659
>>17 とりあえず gcc -v して結果貼り付け。
>>17 リンク先見てもらえればそのまま張ってあります。659のほうをドゾー。
>>19 ちゃうちゃう。
% gcc test.c -I./include -c -v
ここまでつけて。そうすると include パスとかずらずら出てくるはずだから。
>>20 レスありがとうございます。
あー失礼しました。テストしたいのですが出先からのアクセスですので
レスは長く後になります。(TT
ヒントをありがとうございます。チェックしてみます。
で、どうなったんだろう・・・・ レス先間違えまくっているあたり注意力に問題がありそうだけど。
>>7 struct {
char c;
achar a;
} b;
printf("sizeof(achar):%u\n",sizeof(achar));
printf("&b: %p\n", &b);
printf("&b.a: %p\n", &b.a);
__aligned__は指定された型/変数が割り付けられるときに、
その先頭のalignmentを指定するだけ。
achar自体はあくまでもchar。
じゃなきゃ通常のchar*を受け取る関数が全く使えなくなる。
>>23 現状での挙動は分かってます。
でも、現状の挙動では
>>7 で書いたような問題が防げません。
aligned指定でsizeofも変わりうる挙動をしていれば、
>>7 の問題も、解決しますし、
配列の先頭だけにalignmentを指定したければ、配列に対して指定すればよい話です。
ですが、alignedの挙動を変更すると、char*にachar*を渡しているような
現状動いているコードが壊れてしまいます。
sizeofも変わりうるaligned指定を別名で作り、
sizeofが変わってしまった場合はポインタが互換しないようにする、
というのは、どうでしょうか?
ちなみに、bugzilla の id=12435 は Andrew Pinski によって 12/28 に
「バグじゃない」ってことで終了されてしまっています。
>>24 > aligned指定でsizeofも変わりうる挙動をしていれば、
>>7 の問題も、解決しますし、
> 配列の先頭だけにalignmentを指定したければ、配列に対して指定すればよい話です。
本当に、それで他の部分に影響でないの?
個人的には配列にたたき込みたいなら構造体にして、padding 自分で詰めれば良いと思うが。
>>25 > 本当に、それで他の部分に影響でないの?
「それ」とは、
「aligned指定でsizeofも変わりうる挙動」をすることですか?
「配列の先頭だけにalignmentを指定したければ、配列に対して指定」することですか?
> 個人的には配列にたたき込みたいなら構造体にして、padding 自分で詰めれば良いと思うが。
アラインメントを指定したいときに、aligned属性があるのなら、
それを使って行うのが自然だと思います。
正しくpaddingを詰めるためには、必要な情報もどうにかしてひねり出さないといけないですし、
構造体にしてしまって、意味薄いフィールド名を考えるのも使うのも面倒です。
27 :
デフォルトの名無しさん :04/01/07 23:17
GCCが卵に見えるからだろうね
ちょっと考えても問題出るな。
>>26 > 「それ」とは、
どっちでも良いけど。
アライメントの問題を解決したが、他の部分で既存のコードが動かなくなるような致命的な
問題が出たら意味ないわけで。現状の gcc の設計と矛盾しないなら、パッチ作って送れば
対応してくれると思うぞ。
というか id=12435 は俺はバグじゃないと思う。
>>24 の解決策の方が相当不味いと思われ。
納得できないのなら ML や Pinski 氏に質問してみたら?それか
>>29 が言うように
パッチ書いてみるかだな。
>>30 今あるalignedの挙動を変えてしまうと不味いのはわかったのですが、
アライメント指定に伴ってsizeofも変わること自体が「相当不味い」のでしょうか?
挙動が変わるので、新しい別の属性キーワードを作る必要があるとおもいます。
そしてその属性をつけた型および値を指すポインタは
オリジナルの型と互換しない(int*とchar*の関係になる)ようにする必要がありそうです。
この方針で問題なければ、パッチを書いてみよう
・・・かなぁ、と思います。
ほかにも不味いところが残っていれば指摘して欲しいです。
>>31 まずすぎるというか、
それじゃ結局別の型を作るだけだろ?
>>25 のいうようにalignof使って構造体作れ。
どうしてもバグにしたい人がいるようだ
>>32 > それじゃ結局別の型を作るだけだろ?
そうです。いま欲しがってる属性を xxx_aligned とすると、
typedef int more_aligned_int __attribute__ ((xxx_aligned (8)));
この宣言でmore_aligned_int型の値はすべて8バイト境界に割り当てられます。
void f( more_aligned_int* p );
この宣言で、f()は8バイトアラインが保証されている整数型へのポインタを受け取ります。
無理なキャストをはさまない限り、
この関数に不正なアライメントの値を渡すコードはコンパイルできなくなります。
現状のalignedの挙動では、上記のような宣言をしても、
f()の定義側で引数pが正しくアラインされていることを期待できません。
今回の件を知らなければ、こんな関数を作って不可解なバグに悩まされていたかもしれません。
ドキュメントに"force the compiler to insure (as far as it can) that ..."とあったので、
やっぱりバグではなく、こういう仕様のようです。
パッチ書くより、「この"as far as it can"をもっと具体的に書いとけ」と突っ込むのが良いように思います。
(´-`).。oO(いったい何がしたいんだろう?)
>>34 typedef は型に「別名」をつけるだけで、型を作成するものじゃないが。typedef したものが
別の型ってことになると、C/C++ の従来の typedef と意味が違ってしまうから、影響でか
すぎだと思うぞ。
矛盾しない形で gcc のソースコード改修できるのなら、パッチを作る事は止めないが。
別の型には変わりないが、完全に互換性がある。
>>36 typedef int const cint;
typedef int volatile vint;
typedef int iarray[2];
こんなのと同じ感じじゃないの?
39 :
デフォルトの名無しさん :04/01/09 01:15
more_aligned_int* p p++はどんなうごきすんねん
>>39 (more_aligned_int*)((char*)p + sizeof(more_aligned_int))
得られたポインタはmore_aligned_intのアラインメント要求を満たす。
sizeof(more_aligned_int)は、sizeof(int)以上で最小の8の倍数になる。
more_aligned_int*からint*への変換はエラーにしないといけない。
41 :
デフォルトの名無しさん :04/01/09 01:30
うざってー 構造体&paddingでなぜ不満? 却下である!
本7うざい死ね
>>34 > パッチ書くより、「この"as far as it can"をもっと具体的に書いとけ」と突っ込むのが良いように思います。
だったら今すぐそうすればいいだろが、誰も止めないぞ。
オープンソースである以上、必要だと思った人間が手を動かす。
今までもこれからもそうやって成り立っていくんだよ。
文句は言わないけど自分は手を動かさないってんじゃ話にならんわ。
独り言なら日記にでも書きたまえ。
パッチ書いてもいいけど、ばらまかないでね。 迷惑だから。
>>34 > 今回の件を知らなければ、こんな関数を作って不可解なバグに悩まされていたかもしれません。
それはGCCのせいじゃなくて、そんなおかしな設計したお前に責任がある。
s/した/する/
align関連はGCCの独自仕様なのだから、君が思った仕様と食い違っていても、 その仕様はくつがえらないし、もちろんバグではない。 問題視して欲しければ、GCCの仕様のままで通常使用したときに、致命的な 問題が発生することを示すか、他の仕様と論理的不整合が存在することを 示す必要がある。 それができなければ、ローカルパッチを作って、思う存分使えばいい。
ちょっと使ってみたかったりして<PL/I 大昔バイトで使って以来書く事もなかたので。
PL/1はいいぞー Fortranもいい。 なんていうか、そそるものがあるんだよ
>>50 魅力が全然分からん。
小一時間愛を語ってはくれんかね?
名前指定ループ多段ブレイク
gotoとどう違うんですか?
>>53 goto みいにどこにでも飛べるわけじゃなく、ループから抜けると言う意図がはっきり伝わる。(=読みやすい)
C/C++ にも欲しいよ。
56 :
デフォルトの名無しさん :04/01/10 22:33
ラベル名を工夫すればはっきりと伝わると思うが。
まあ、goto 文使ったってわかりやすいプログラムは作ることができるからね。
でも、「ラベル名を工夫すれば」と言う労力がかかるし、それができない奴もたくさんいるから。
(今見たら、
>>55 日本語変だな。goto みいに → goto みたいに)
> それができない奴もたくさんいるから。 L1,L2,・・・・,Lnとつけている俺のことか?
>>55 そんなあなたにPerl
だいたい
>>52 程度でPL/Iへの愛を騙(ry
>>57 break でも、それなりの名前つけないとダメだろう。
>>60 名前指定ループ多段ブレイク があれば何でもいいわけじゃないぞ。
>>61 どんな名前でも、「ループを抜ける」と言う意図は伝わるぞ。
どんなループなのかわからんと言うのはまた別の話だし。
>>62 ハァ ?
具体的に書いてみてくれ。
>>63 邪悪な提案を1つ。
#define break_loop goto
65 :
デフォルトの名無しさん :04/01/11 03:10
>>40 >more_aligned_int*からint*への変換はエラーにしないといけない。
C的には Warning で。
一時変数(ただの配列だけど)に aligned アトリビュート効かなくて
面倒な思いをした事は何度かあるけど、
>(more_aligned_int*)((char*)p + sizeof(more_aligned_int))
>得られたポインタはmore_aligned_intのアラインメント要求を満たす。
>sizeof(more_aligned_int)は、sizeof(int)以上で最小の8の倍数になる。
それなら当然一時変数も対応?ちょっとしたパッチじゃ済まんよ。
挙動がわるいぞ? 今日どうしたんだろう…
>>64 行き先ラベルの定義はどうやるんだ ?
C/C++ のマクロはここら辺が作りにくい。
昔さわった汎用機の PL/I のマクロは、substr() なんかの文字列操作は当たり前、FOR, WHILE 等の制御構文に加えて手続き/関数定義までできた。
ほとんどフルセットのインタープリタだったよ。
(使い出すと面白くて病みつきになるけど、はっきり言って や ・ り ・ す ・ ぎ。)
C/C++のcppが貧弱すぎるという方が正しい物の見方だと思うぞ。 C++はtemplateやらinlineやらというマクロ構文のおかげでわりとましになったが、 もともとの育ちの悪さからくる使い勝手の悪さはついて回る。 cppとtemplateとかが連携していないから、デバッグ版のnew/deleteを作ろうと すると行番号などを渡すのが難しかったりとかするし。 まあそこまでは望まないにしても、どうしてm4くらいにしなかったのかねえ。 条件分岐とか任意個の引数それぞれについて展開文を生成するくらいはやって欲しいと 時々思う。
>>68 > まあそこまでは望まないにしても、どうしてm4くらいにしなかったのかねえ。
そりゃあ UNIX V6 書いた時代に m4 なかったからだよ。
ああ、そりゃそうだな。確かに。
gccソース配布にはTreelangというフロントエンド実装例示用言語のレクサとパーザとあれこれが付属. GNU VHDLがGCCのフロントエンドとして書かれていたと思った.フランスの教育機関の中の人.
74 :
デフォルトの名無しさん :04/01/12 23:48
gccのソースをチェックアウトしようと思って、cygwin bash shell から
$ cvs -d :ext:
[email protected] :/cvsroot/gcc co -P gcc
ってしてみたんですが、
> savannah.gnu.org:接続がタイムアウトしました
rsh.exe: can't establish connection
cvs [checkout aborted]: end of file from server (consult above messages if any)
と表示されて取ってこれませんでした。
ここ2日ほど試してるんですけど、同じメッセージが出ます。
何が悪いんでしょうか?
77 :
デフォルトの名無しさん :04/01/13 22:18
-Wmissing-prototypes が、Cではちゃんと警告出すのに、C++だと動作しないみたいなんですが、 bugzillaに情報があるかどうか調べるにはどうしたらいいのでしょうか?
つーかそもそもC++だとprototypeないとダメだろ。
-Wmissing-prototypesは、グローバルな関数の定義に対して、 先にプロトタイプ宣言が無いことを警告するものです。 呼び出し側でエラーになるのとは別です。
gcc開発してる人達ってこれが本職なの? RedHatやSuSEが金出して雇ってるのかな。
SuSEは買収されたYO
みんなRedHatのことを悪くいうけど、 GCCの開発者の多くはRedHatだよな。 ああいう会社は大事にしないといけない。 オプソ注はガキだから、独占商売してる! とかうるさいけど。だったらお前がGCC作れ、と。
>>80 どっちも金出してる。
勤め人が片手間でこなせる作業量じゃないし。
>>82 Cygnusから流れただけやん。
金にならんからクビって事がないことを願おう。
流れたっつーか買収されたっつーか。 でもRedHat Linuxやってる連中と旧Cygnusの連中の間には溝がある ような気がしないでもない。何年か前、リリース版じゃないgcc 2.96を RHに載せて出荷しちまったとかでgccチームが抗議文出してたしな。
85 :
デフォルトの名無しさん :04/01/24 19:23
gccint.texiをHTMLで読もうと思って、gccのソースディレクトリ(以下では GCC )から、 $ makeinfo -Igcc/doc -Igcc/doc/include --html -ogcc/doc/HTML/internal gcc/doc/gccint.texi としてみました。 でも以下のようなメッセージが表示されて、index.htmlが生成されません。 GCC/gcc/doc/HTML/internal/index.html: TOC should be here, but it was not found GCC/gcc/doc/HTML/internal/index.html: TOC should be here, but it was not found makeinfo: Removing output file `GCC/gcc/doc/HTML/internal/index.html' due to errors; use --force to preserve. texiのことは良く分からないですが、テキストエディタでgccint.texiのなかを覗いてみたところ、 メニューっぽいものは書いてあるようです。 index.htmlをきちんと(--force使わずに)生成するには、どうしたらいいんでしょうか?
>>85 gcc-3.3.2/gcc/docディレクトリに移動して、
$ makeinfo -Iinclude --html gccint.texi
だけで問題無くできたけど、ちなみに
makeinfo (GNU texinfo) 4.6です。
>>86 レスありがとうございます。
こちらの環境はcygwinで、makeinfoのバージョンは(GNU texinfo) 4.2でした。
バージョンの古さが原因の問題なのかもしれません。
で、望むものはgccのサイトに置いてあるのに気付いたので、
そちらを使わせてもらうことで解決しました。
age
C#のフロントエンドやMSILを出力するバックエンドを 作るような話はあるんでしょうか?3.5以降になるのかもしれませんが。
90 :
デフォルトの名無しさん :04/02/12 16:14
makedepend が g++ に対応していなくて cstddef や cstdio が探せない どうしたらいい?
g++ -M
>>91 makefileのDO NOT DELETE This line以降を書き換えるようにできないでしょうか?
> makefileのDO NOT DELETE This line なんですかそれは?
sed '/DO NOT DELETE This line/q' Makefile > Makefile.tmp g++ -MM $(SRCS) >> Makefile.tmp mv -f Makefile.tmp Makefile
俺なら include するかなぁ。 Makefile.dep: $(SRCS) g++ -MM $(SRCS) > Makefile.dep # dependencies .include Makefile.dep 構文これであってたっけ?(;´Д`)> 最近は専ら automake/autoconf だから自分で Makefile 書かなくなったな。
>>95 > Makefile.dep: $(SRCS)
> g++ -MM $(SRCS) > Makefile.dep
追記じゃなければ -MMF Makefile.dep でもいい。
> .include Makefile.dep
BSD make?
たしかBSD makeは.dependってのを自動的にincludeしてくれると聞いたような
気がするので、こうするとGNU makeとBSD makeでは共通にできる。
# Makefile
.depend: $(SRCS)
g++ -MMF $@ $(SRCS)
# GNUmakefile
include Makefile
include .depend
> 追記じゃなければ -MMF Makefile.dep でもいい。 10ヘー(・∀・)⊇ > BSD make? あぁ、先頭に . がいるのは BSD make だったか。 間違えますた、スマソ。
gcc -laaa -lbbb main.o →リンク失敗 gcc -laaa main.o /usr/lib/libbbb.a →リンク成功 /usr/lib/ には libaaa.a も libbbb.a もあるし、 libaaa.a は正常にリンクされているのに。 なぜでしょうか?
100 :
デフォルトの名無しさん :04/02/20 07:07
朝から釣りか。
エラーメッセージ見りゃ見当つくだろ。
gcc main.o -laaa -lbbb いじょ
3.3.3は話題にもならない?
g++のtemplateもかなり良くできてきたし満腹状態。 g++拡張でtypedef templateが付いたら教えてねん。
g++のコンパイル速度って、こんなもん? 体感できるほどPCHで劇的に変わるんでしょうか。
107 :
デフォルトの名無しさん :04/02/22 12:47
適当に age とこうか.
>>103 そもそもリリースのアナウンスって流れたっけ ?
ftp mirror に行きわたるのを待ってると言ったっきりのような.
>>106 サンクス。g++自体のコンパイルに時間がかかりそうだけど、
おわったら試してレポートします。
やってみました。cygwin上の gcc version 3.4.0 20040218 (prerelease) なg++です。比較の対象にしたのは、3.3.1です。 結果としては、コンパイルの速度はあまり変わらなかったけど、 吐かれたバイナリの実行速度が結構速くなってました。 ってこれじゃPCHと関係ないですよね。 俺がやり方間違えたかな…参考にならないレポートですんません。
PCHてなにもしなくても効果するん? 設定ファイルとか、オプションとか必要ないん?
今見たら ftp.gnu.org にも 3.3.3 置いてあったよ.
3.3.4のはなしもあるみたい。
>>110 最適化が上がったけどコンパイル時間が増えなかった。
と考えると効果あり?
PCHを使うにはオプションが必要だった気がしたけど
116 :
デフォルトの名無しさん :04/02/23 16:29
>>96 サブディレクトリを$(SRCS)に含んでいるとうまくいかないのですが何か方法ありますか?
SRCS := ${SRCS} misc.cpp
SRCS := ${SRCS} foo.cpp
SRCS := ${SRCS} subdir/window.cpp
てな状態の時の出力が
misc.cpp: misc.h
foo.cpp: foo.h
window.cpp: subdir/window.h # subdir/window.cpp : subdir/window.h になって欲しいのに!!
のようになってしまうのでつ。
生成ルールのターゲットになるのは *.cppじゃなくて *.o だろ? -oオプションで指定しない限り,コンパイルしたオブジェクトファイルは カレントディレクトリに作られるので window.o: subdir/window.cpp subdir.window.h となって当然だと思う。 infoを見ると、-MT target というオプションをつけると変更できるようなので、 どうしてもというなら、${SRCS}についてループを回せばできるんじゃないかな。
>>117 >生成ルールのターゲットになるのは *.cppじゃなくて *.o だろ?
いっけね、うっかりしてましたです。
>infoを見ると、-MT target というオプションをつけると変更できるようなので、
>どうしてもというなら、${SRCS}についてループを回せばできるんじゃないかな。
-MT はうまくいきましたです。ありがとうございます。
ループを回すっていうのは↓みたいな感じでしょうか?GNUのmake専用になっちゃうんすかね?
もう少し賢いやり方あったら教えてもらえると嬉しいです。
depend:
$(RM) Makefile.dep
$(foreach src, $(SRCS), g++ -MM -MT $(src:.cpp=.o) $(src) >> Makefile.dep;)
depend: for s in $(SRCS); do g++ -MM -MT `echo $$s | sed 's/\.cpp$$/.o/'` $$s; done > Makefile.dep でいいんじゃないの? (非GNU make依存)
120 :
デフォルトの名無しさん :04/02/25 06:15
3.3.3 あなうんすきたーage
tree-ssaのfrozeきてたー gcc/ssa-*をさっそく調べないと。
122 :
デフォルトの名無しさん :04/02/29 15:46
ソースからライブラリを指定したいのですが、 VCの #pragma comment (lib, "***.lib") に相当するものはGCCにあるのでしょうか?
>>115 試したのがしばらく前なので、状況変わってるかも知れんが。俺が試したとき
には、ヘッダファイルを事前にコンパイルしておく必要があった。
% gcc foo.h
これで #include "foo.h" しているファイルをコンパイルすると、勝手に
プリコンパイル済みヘッダが使われた。
あと VC の stdafx.h のように「よく使うヘッダファイルを全部 #include する
だけのヘッダ」を用意して、そいつをプリコンパイルしておくと良いみたい。
多数のヘッダを個別にプリコンパイルしても、あまり速くならなかったよ。
おれもPCH使ってみたけど、遅いのはインクルードファイル処理じゃ無いから全然 速くならなかった。 Cで巨大ファイルインクルードしてないと意味ないんじゃないか? またはC++で巨大汎用テンプレートをインクルードするけどほとんど インスタンス化しない場合とか。 致命的なのはmakeファイル作り替えないといけない点。
>>124 つまり boost::* 用ってことでFA?
Static Single Assignment使ってるから、 部分冗長性の検出とか定数伝搬がより賢くなる可能性があるんでしょ。 言語に依存しないレベルで、かつ、RTLや生成コードよりもう少し抽象度の高いところで。
128 :
デフォルトの名無しさん :04/02/29 17:40
setjmpの関数アドレス取得しようとして数十分はまった。 >XXXX.c:77: `setjmp' undeclared (first use in this function) >XXXX.c:77: (Each undeclared identifier is reported only once >XXXX.c:77: for each function it appears in.) で、結局 setjmp.h >#definesetjmp(x)_setjmp(x) これが原因かよ おいおい関数マクロたのむよ mingwだけど。
>>129 #include <setjmp.h> 忘れただけだろ ?
131 :
デフォルトの名無しさん :04/02/29 18:28
>>130 ちーがーうー
setjmpが関数マクロだったから、
setjmpの名前だけ書くと未定義エラーになるわけ。
関数マクロは後ろの括弧が必須なの。
mingwのinclude/setjmp.h見りゃわかる。
ただのマクロでいいものを関数マクロにする開発者もアホだが、setjmpのアドレスを得ようとする129もアホ。
133 :
デフォルトの名無しさん :04/02/29 18:32
だからそれに気づいて #ifdef __GNUC___ add_func(_setjmp); add_func(_longjmp); #else //その他 add_func(setjmp); add_func(longjmp); #endif みたいにした。 んで、これには続きがあって、よく見たら対になるlongjmpは 関数マクロじゃない。 これに気づかずになんでだろーなんでだろーと 延々コンパイルを繰り返したさ。 #ifdef __GNUC___ add_func(_setjmp); add_func(longjmp); #else //その他 add_func(setjmp); add_func(longjmp); #endif 結局これが正解。 馬鹿野郎。
135 :
デフォルトの名無しさん :04/02/29 18:33
>>132 スクリプト言語の実装で必要なんだよアホ
136 :
デフォルトの名無しさん :04/02/29 18:34
>>134 はあ?どこに「マクロ」なんて書いてあるんだよアホ!
137 :
デフォルトの名無しさん :04/02/29 18:35
あああ
>setjmpマクロ
アホはおれだけかよ!
悪かったな
>>132
>>127 というと相当広範囲な最適化が望めるって事ですね。そりゃ、スバラシイ。
(でも処理系専門外な自分は多分その素晴らしさの一割も理解できてない…)
139 :
デフォルトの名無しさん :04/02/29 18:36
つーかね、わざわざ関数マクロにしてトラップ作る必要ねーだろ ざけんな!>mingw
>>137 俺も勉強になった。
マクロと決まっているのはassertだけじゃなかったのか。
>>137 俺も知らなかった…K&RにもC99にもそう書いてあるわ。
あとマクロと決まってるのはva_*くらい?
std{in,out,err}が「マクロ」なのは、glibcのhackで有名、かな。
# Linuxな人は今すぐ grep stdin /usr/include/stdio.h
マクロか疑似関数じゃないとsetjmp()は実装しにくいでしょ。 ほとんど全てのregisterを保存しないといけないわけだから。 関数で実装するとstackのrewindして(から)保存しないといけないからね。 C99でもgetcなんかもマクロなんじゃないの?
そうだ。va_argとかもマクロだ(^_^;) va_argは型名を受けるから関数として実装するのは不可能だもんな。
>>142 そんなことないよ
mingwはmsvcrt.dll借用してるよ
なことないって言われても… Windowsは1CPU, 1プラットフォームでしょ。
なんかトン沈下んな奴がいるな 145のことだが。
>>142 getc・putc共に、C99でも「マクロ『かも』しれない」です。
これはC89から変わってないですよね。
# C99持ってない方、C99相当のJISがPDFで手に入ります。
#
ttp://www.jisc.go.jp/ →JIS検索→JIS X3010 でどうぞ。
>>142 別に関数で普通に実装できますがなにか ?
例えば、FreeBSD 4.8R/i386 + GCC 2.95 は関数で実装されてるよ。
>>148 手元のi386なglibc-2.2.4でも、cygwinで使ってるnewlib-1.12.0でも、
setjmp()は関数です。もちろんソースは「.S」。
# マクロじゃなきゃ規格非準拠だ! って怒られたら、
# glibcのstdinみたく「Make them happy.」にすればいいって事なんだろう
俺俺に聞け→勉強するぞ から流れてきました。ちょいと教えとくれ。 #include <stdio.h> /* #define GLOBAL */ #ifdef GLOBAL const int DragonKiller=15000,AngelRobe=3000,DragonShield=3500; struct _item{ char *name; int price; }ItemList[]={ {"ドラゴンキラー", DragonKiller}, {"天使のローブ", AngelRobe}, {"ドラゴンシールド",DragonShield}, }; #endif int main(void) { #ifndef GLOBAL const int DragonKiller=15000,AngelRobe=3000,DragonShield=3500; struct _item{ char *name; int price; }ItemList[]={ {"ドラゴンキラー", DragonKiller}, {"天使のローブ", AngelRobe}, {"ドラゴンシールド",DragonShield}, }; #endif return 0; } GCC 3.3.1 で、GLOBAL無効だとOKなんだけど、 GLOBAL有効だとコンパイルエラーになるんだ。なんで?
const qualifierのついた変数は定数ではない。
ローカル変数とグローバル変数とでの違いが気になります
グローバル変数は定数でしか初期化できない。 ローカル変数は初期化時点で決まっている値ならOK。
つーかどこがGCC依存な話題なんだ??
それ、VCだと通ったりするんじゃない? そんなケースが前あった。
>154 例えば ボーランドのbcc32とかだとローカルだろうがグローバルだろーが "不正な初期化"となるのです
→してないんでしょ
了解です。分かりました。
すんません。PCHの話題の言いだしっぺです。 110で一度レポートしたのですが、冷静に色々やってみるとPCHが有効になっていなかったみたいです。 GCC(3.4.0 20040218 (prerelease))は/usr/local/以下にインストールしました。 自分がコンパイルを試したソースでは #include <iostream> #include <string> ... などとなっていたので、/usr/local/include/c++/3.4.0の中で g++ -x c++-header -c iostream g++ -x c++-header -c string ... とやって*.gchを作りました。その後でコンパイルをしたのですが、 g++ -H (...) 2>usedheaders とやっても、usedheadersの中に*.gchが出てきません。infoが正しければ、「...!」と出てくるはずなんですが…。 何が足りないんでしょうか。
ここで聞いていいのか分からないんですけど……。 libfoo.so や libfoo.a があったとして、その中から特定のシンボルだけ 削除したい場合ってどうすればいいですか?ソースはありません。
>>161 やり方は知らないけど、なんでそんなことするの?
関係ないけど、binutilsにELFの形式をチェックするような ツールってある?
>>161 .aはar使えばいいじゃん。ar知らずにどうやって.a作ったのさ。
.soは知らん。
gcc3.3.3の標準ライブラリのソースを見たいのですが、 どのディレクトリにあるのでしょうか?
標準ライブラリって、Cの? それは普通言語処理系じゃなくてOSが持つ。
レスどうもです。 説明不足ですみません。 Cのprintf, scanfなどのANSI標準ライブラリ関数のソースのことです。 gccのソースコードから抜き出したいと考えてたのですが…
抜き出してどうすんのん? ライセンスあるよん。 glibcの中にあるの。
なるほどglibcにあったのですね。 Cの勉強をしていて、あるライブラリ関数がどのように実装されているのか 興味があって、探し求めていたんです。 どうもありがとうございました。
gccが使う標準Cライブラリはglibc以外にもいろいろあるわけだが、
173 :
デフォルトの名無しさん :04/03/12 14:00
コンパイルしたプログラムに どのバージョンでコンパイルしたか埋め込める#define とか 関数ってあるの? int main(){ printf("thist complile by%s",#GCC_COMPILE_VERSION); } という風にしたいんだけど
>>173 __GNUC__ と __GNUC_MINOR__ で何とかならないか。
大抵のコンパイラは自身を識別する定義済マクロを用意していて、 (メジャー)バージョン番号がその値になっていることが多い。 gccなら __GNUC__ と __GNUC_MINOR__ (それぞれ整数)。 __VERSION__ もある (こちらは文字列)。
__atribute__
gccの解説本で良いのありますか?
>>179 infoはだめか?
info以上の情報があるなら俺も知りたい。
うーん。 2chってこんなに低レベルだったの? # って嘆いてみるテスト
特に若い人に、調べる能力の低いのが多いね。
2chにレベルもクソもないと思うが
コンピューティングが低年齢の人に解放されたってことで喜んでいいんじゃない? といってもこんな所でクダ巻いてる奴なんて小学校の頃から触ってるか 低レベルすぎる質問は無料コンパイラとして初心者の入門用にと 宣伝されてるから仕方ないと思われ
低レベル云々の煽りは馬鹿の証し
>>181 って逆切れ厨でしょ。文句あるなら自分で調べろよ。
187 :
デフォルトの名無しさん :04/03/21 14:55
gccってどうやってインストールするんですか?
>>187 ./configure --prefix=/usr/local
make bootstrap
make install
確かこんな感じ。インストール先ディレクトリは./configureに--prefixオプションで指定する。
configure && make all && make install
すいません、初心者なんで何をどうすればいいかも 分からないんです。 参考になるページか何か知っていませんか? 自分でも調べたけどわかんなくて、、、、
もっと質問の仕方ってものがあるだろうし、 '初心者'は免罪符でもなんでもない とりあえずOS環境を書けよ まあ答えは出てるけどさ
おまいら釣りにひっかかってあげるやさしい奴
>>191 すいません。 今度から気をつけます。 >>192 ありがとうございます。 >>193 釣りではありません。
それでもOS環境をかかない頑固な194。
いきなり自動車免許を取ろうとせずに歩行者・三輪車・自転車……と 段階的にすすめてみてはどうだろう。
歩行者です gccってどうやって使うんですか?
先行者です キャノンってどうやって使うんですか?
あなたには使えません
お前ら面白すぎ
3.4branchが切られてメインラインがいつのまにか3.5になってまつね。
奇数バージョンは安定しないんだっけ?
major>minorのうちは危ないというが、 奇数・偶数の区別はない。
205 :
デフォルトの名無しさん :04/03/22 19:30
>>204 了解。
>>205 そういうジンクスがあるってだけで、
実際その通りってわけじゃないよ。
207 :
デフォルトの名無しさん :04/03/22 20:50
printfの%pにint *等を渡すと警告が出る(要-ansi -pedantic)。 最初バグかと思った。void *じゃないと警告が出るのね。
さすがpedantic。マゾ向けですな。
>>207 >void *じゃないと警告が出るのね。
理由は何?
>>209 なんだろう?
可変個引数ゆえにtype *がvoid *に変換されずにそのまま渡されるからかな?
そこまで文句をつけるかー!?って思うけど(だからこそpedanticなのかな)
3.3.2や3.3.3では出るけど、2.95.3では出ないね。
| 7.19.6.1 The fprintf function | 8 | p The argument shall be a pointer to void. The value of the pointer is | converted to a sequence of printing characters, in an implementation-defined | manner. と、void へのポインタって書いてあって、かつ、 >可変個引数ゆえにtype *がvoid *に変換されずにそのまま渡されるからかな? かと思われ。
さすが pedantic だ
-ansi -pedanticだけじゃ警告出ないな。-Wall付けると出る。
CFLAGS=-std=c99 -Wall -pedantic だなぁ。みんな、-Wall だけなの?
3.4はスケジュール通りだせるんでつかね。 Mitchellタソ、ブチ切れぎみですが・・・ GCCの開発は、いろいろ踏まえなくてはならないことが 多すぎてなかなか大変だとは思いますががんがってください。 応援しております。
俺もそうおもた
gc#出ないの?
219 :
デフォルトの名無しさん :04/03/25 08:59
俺もそうおもた
220 :
デフォルトの名無しさん :04/03/29 11:44
glibcコンパイル時は-fomit-frame-pointerを付けてはいけないのか。 くそー、俺の二時間を返せ。
プリコンパイルヘッダ対応マダー?
Appleのgccは独自のプリコンパイルヘッダ対応付いてるよ。 cpp-precompってやつ。
conio.hをインクルードするには、 コンパイルするときにどのようなオプションをつければいいんですか?
インクルードするのにオプションは必要ない
いや、そのconio.hがサーチパスに入っていない場合は、-I<そのパス>が必要か
>>231 stdio.hと同じディレクトリに入ってるんですが。
234 :
デフォルトの名無しさん :04/04/20 11:15
gcc3.4.0をインストールしてプリコンパイル済みヘッダを使おうとしたら test.cc:1: sorry, unimplemented: had to relocate PCH というメッセージが出ました。ホントに実装されてないんですか? それとも私が何かおかしなことをしているんでしょうか。 実行した手順は以下のとおりです。 1.インストール ftp.dti.ad.jp から gcc-core-3.4.0-20040416.tar.gz と gcc-g++-3.4.0-20040416.tar.gz をコピー 3つのディレクトリ /srcdir /builddir /usr/local/xp を作成して上記2つの .tar.gz ファイルを/srcdirに展開 cd /builddir /srcdir/gcc-3.4.0-20040416/configure --prefix=/usr/local/xp --enable-language=c++ make bootstrap make install /usr/local/xp/bin にパスを通す 2.使ってみる /usr/local/xp/bin/g++ test.hh /usr/local/xp/bin/g++ test.cc ---- test.hhの中身 ---- #include <iostream> ---- test.ccの中身 ---- #include "test.hh" int main() { std::cout << "hoge" << std::endl; return 0; }
235 :
デフォルトの名無しさん :04/04/20 19:06
GCC 3.4.0 リリースage ftp;//ftp.gnu.org/gnu/gcc/gcc-3.4.0/
あ、ChangeLogじゃないか。 変更点一覧だ。
>>236 出てないけど、前もそうだったし、まぁいいかな、と。
アナウンスがない以上はバイナリの差し替えもありうるということですよね。
3.3.3を上書きしちゃったから確認はしてないけど、プリコンパイルヘッダ無 しでも3.3.3よりC++のコンパイルが速くなった気がするなぁ。パーザを書き変 えた効果がこんな所にも出てるのかな。
> GCC 3.4 automatically places zero-initialized variables in the .bss section on some operating systems. > Versions of GNU Emacs up to (and including) 21.3 will not work correctly when using this optimization; > you can use -fno-zero-initialized-in-bss to disable it. うれしいな〜
>>239 ある程度ミラーされるまでアナウンスしない方針だったような。
今週中には出ると思うが。
>>241 2行目以降も引用して「うれしいな〜」と言っているところを見ると…アンチEmacs? (w
vivavi
-pedantic を愛用してる俺はダメ人間ですか?
リリース版入れたけどダメだ orn cygwin未対応なのかな
gccがC#に対応するなんてことあるの? Unix上でC#使ってみたいんだけど・・・
monoじゃだめなの?
>>246 それ以前にウチのCygwinでコンパイル通んないんすけど・・・。
>>248 ありがと。既にもうあったんだ・・・調べてみます。
251 :
デフォルトの名無しさん :04/04/21 23:59
gcc 3.4: * The C, C++, and Objective-C compilers can now handle source files written in any character encoding supported by the host C library. The default input character set is taken from the current locale, and may be overridden with the -finput-charset command line option. In the future we will add support for inline encoding markers. MinGWのランタイムとかCygwinって日本語ロケールはサポートしてるのかな?
それ iconv 必須
iconvがあればいいの? じゃあ話は簡単だね。
GNUのネ申が言うんだからしかたない漏れも逝くか。
なんでcomplex (and imaginary) support in <complex.h>がBrokenなんだろ
ちゃんと理由書いてあるやん。
ぐはぁっ。ほんとですね。イッテキマス…
264 :
デフォルトの名無しさん :04/04/24 13:13
GCCは3.0からC++ISO準拠したと聞きましたが ISO以外の形式はコンパイルできないのですか?
>>264 ISO以外の形式とはなんだ。
誰かの脳内にある俺様C++をGCCの中の人がわかるわけないだろ。
266 :
デフォルトの名無しさん :04/04/24 20:22
>>265 例えば
cout << "文章" << x << "文章2" << endl;
(xは変数)
でコンパイルすると「stray '\33' in program」「文字の終端を欠いています」
と出てコンパイルできません。
cout << "文章" << x;
cout << "文章2" << endl;
とするとうまくいくのですが
foo.cc: #include <iostream> using namespace std; int main() { int x = 10; cout << "文章" << x << "文章2" << endl; } % g++ foo.cc % ./a.out 文章10文章2 うまくいくけど?
268 :
デフォルトの名無しさん :04/04/24 20:43
269 :
デフォルトの名無しさん :04/04/24 20:45
解決しました。 文字コードの問題だったようです。 エディタを変えたら無事コンパイルできました。
>>266 > cout << "文章" << x << "文章2" << endl;
> (xは変数)
これがISO C++に適合したプログラム断片じゃないと思ったわけだ…
これ知ってたか? -fpreprocessed
272 :
デフォルトの名無しさん :04/04/25 17:10
それでgcc3.4はどうよ? > 使用してる奴
以下を実行すると.. gcc -###
275 :
デフォルトの名無しさん :04/04/26 02:21
RH9付属のgcc-3.2.2でgcc-3.4をmakeできた人いる?xgccができたあたりでICEしちゃうんだけど..
gcc -finput-charset=sjis -fexec-charset=sjis testsjis.c -o testsjis 内部で\がすべて2バイトコードに変換されてしまいます。 libiconvのsjis->utf-8がよろしくないようで
277 :
デフォルトの名無しさん :04/04/26 13:11
もろ環境依存の話ですが, どこに書けばいいのかわからないので,ここに書かせてください. (もし,適切な場所があれば誘導をお願いします.) MacOSXのg++(3.1 20020420)で(gccではなく)isnanを使いたいのですが,うまくいきません. #include <cmath> int main () {double d (NAN); std::isnan (d); return 0;} なるコードをg++ test.cppすると, `isnan' undeclared in namespace `std' とエラーがでてしまいます. stdを取っても同じエラーが出ます. ヘッダをチラッと読んでみると,__isnanみたいな関数が途中あったので, こちらを呼ぶと,とりあえずはビルドできるんですが, これは正常な使い方とは思えません. どうやって使ったらよいものかご存知の方いらっしゃいますでしょうか?
278 :
デフォルトの名無しさん :04/04/26 13:22
>>277 解決方法ではないんだが、
ISO/IEC 9899:1999 (C99規格) の§7.12.3.4 によると、isnanはマクロとなっているね。だからとりあえずstd::は不要だ。
>>276 長らくバックスラッシュを \ で代用していたことの弊害が本格的に出てきたヨカーン。
スレ違いだけど、本質的な解決策ないよね。gcc 的にはアドホックな解決でいいんだろうけど。
>>278 > 解決方法ではないんだが、
> ISO/IEC 9899:1999 (C99規格) の§7.12.3.4 によると、isnanはマクロとなっているね。だからとりあえずstd::は不要だ。
レスありがとうございます.
std::取っちゃうと,
`isnan' undeclared (first use this function)
とのエラーがでちゃうんですよ.
ちなみにgccで(#include math.h>して)は,コンパイルは正常に行えます.
(ただし,別件になりますが,リンカで,
ld: Undefined symbols:
___gxx_personality_v0
のように出てしまいます.-lmはしてみたんですけど,
こちらは何をリンクすればいいんでしょうか?)
281 :
デフォルトの名無しさん :04/04/26 14:03
だからマクロだっての。
>>280 #include <cmath>
int main () {double d (NAN); isnan (d); return 0;}
>>281 > だからマクロだっての。
すみません.
リンカの話,忘れてください.(エラーでなくなった.)
>>282 test1.cpp: In function `int main()':
test1.cpp:2: `isnan' undeclared (first use this function)
test1.cpp:2: (Each undeclared identifier is reported only once for each
function it appears in.)
>>277 gcc3.3.1はうまくいった
$ g++ test.cpp
$
>>286 > gcc3.3.1はうまくいった
これ,Mac OS X上のgccでしょうか?
288 :
デフォルトの名無しさん :04/04/26 14:58
>>285 んな話じゃない。Shift-JISはISO646IRVではなくてJIS X 0201(のLeftHalf)を仮定してるって話だよ。
ゲラゲラ
必死だなw
>>285 >それってエディタが全角に変換してない。
iconvのソース(shift_jisx0213.h)より
/* Plain ISO646-JP character. */
if (c == 0x5c)
*pwc = (ucs4_t) 0x00a5;
else if (c == 0x7e)
*pwc = (ucs4_t) 0x203e;
else
*pwc = (ucs4_t) c;
>>288 euc-jpだと\(0x5c)を元に戻してくれるみたい。なぜ?
>>290 > Linux
ああ,やっぱそうですか.
私の所も,Linux(gcc 3.3.3)ではうまく行くんですよね.
う〜ん.OS Xの人はどうしてるんだろう?
Panther (10.3.3) 使ってるけど同じエラー出た。 $ gcc isnan.cpp -o isnan isnan.cpp: In function `int main()': isnan.cpp:2: error: `isnan' undeclared (first use this function) isnan.cpp:2: error: (Each undeclared identifier is reported only once for each function it appears in.) $ gcc -v Reading specs from /usr/libexec/gcc/darwin/ppc/3.3/specs Thread model: posix gcc version 3.3 20030304 (Apple Computer, Inc. build 1495)
294 :
デフォルトの名無しさん :04/04/26 15:38
>
>>288 > euc-jpだと\(0x5c)を元に戻してくれるみたい。なぜ?
EUC-JPは、規格上は0x5cがバックスラッシュ(ISO646IRV)なんだよ。実際にどう表示されるかは
実装の問題で。
>>293 > Panther (10.3.3) 使ってるけど同じエラー出た。
あっ,ども.
やっぱりそうですか.
とりあえず,__isnanでも使って凌いどくか.
297 :
デフォルトの名無しさん :04/04/26 15:52
>>296 288に書いてあるままなんだがな・・・・
問題は、
>gcc -finput-charset=sjis -fexec-charset=sjis testsjis.c -o testsjis
>内部で\がすべて2バイトコードに変換されてしまいます。
>libiconvのsjis->utf-8がよろしくないようで
これがlibiconvのバグでもなんでもなくて、Shift-JISというエンコーディングの
仕様に従った動作だという点だな。
279もそう言っている。
288じゃないけど。 Shift_JIS の 0x5c は \ なんだけど、C / C++ のソース中ではバックスラッシュと同じ働きをするという 日本ローカルな慣例が i18n と馴染まないということが問題なのでは(←ローカルだから当然か・・・)?
要するに'¥'と'\'が同居できないって事?
300 :
デフォルトの名無しさん :04/04/26 15:57
>>299 > 要するに'¥'と'\'が同居できないって事?
EUC-JP, Shift-JIS, ISO-2022-JPで日本語を書く限りは同居できない。
直接UTF-8で書けば同居できる。
>>295 これか?
http://www.vallis.org/blogspace/osxtricks > There is a bug in /usr/include/gcc/darwin/3.1/g++-v3/cmath that will
> undo the definition of isnan. To fix it, comment out the line #undef isnan.
> Update: in Panther, the file to change is /usr/include/gcc/darwin/3.3/c++/cmath.
他人が使うモノだと書き換えるわけにいかんだろうから、mymath.hpp でも作って
そっちで isnan() マクロを定義する必要がありそうだね。
>>300 >直接UTF-8で書けば同居できる。
問題は解決しました。
ちょっとまてよ、同居する必要ってそもそもあるの? コンバージョンをしないなら問題ないはずだが。
ウム。
>>304 毛唐はなんでもUTF-8に正規化したがるものさ。
>>297-298 日本では歴史的に EUC と SJIS 間での変換の際 0x00〜0x7f はそのままに
してきたし、UTF への変換でもそうなったところで誰も困らないのに、
GNU libiconv では規格バカが譲歩してくれない。
sjis ではなく cp932 を使えばとりあえず回避できるけどね。
>>301 >
http://www.vallis.org/blogspace/osxtricks > > There is a bug in /usr/include/gcc/darwin/3.1/g++-v3/cmath that will
> > undo the definition of isnan. To fix it, comment out the line #undef isnan.
> > Update: in Panther, the file to change is /usr/include/gcc/darwin/3.3/c++/cmath.
ああ,これっすね.
> 他人が使うモノだと書き換えるわけにいかんだろうから、mymath.hpp でも作って
> そっちで isnan() マクロを定義する必要がありそうだね。
/usr/include/architecture/ppc/math.hから,
#define isnan( x ) ( ( sizeof ( x ) == sizeof(double) ) ? \
__isnand ( x ) : \
( sizeof ( x ) == sizeof( float) ) ? \
__isnanf ( x ) : \
__isnan ( x ) )
これ使うことにします.
>>307 "sjis->utf-8"の場合のlibiconvの処理を変更して(゚д゚)ウマー
ではだめ?
>>307 いやしかし gcc 的にはどうであれ、世間的には圧倒的に \ は円記号として使われてるわけで・・・
UTF-8 にしたらバックスラッシュで表示されますた、ではまずいような。
\(゚听)イラネ
そこで trigraph ですよ。 main() { printf("表示??/n"); } % gcc -trigraphs -finput-charset=sjis -fexec-charset=sjis sjis.c % ./a.out 表示
315 :
デフォルトの名無しさん :04/04/26 20:38
そこで trigraph ですよ。 main() { printf("表示??/n"); } % gcc -trigraphs -finput-charset=sjis -fexec-charset=sjis sjis.c % ./a.out 表示
うにこーどの円マーク: ¥ バックスラッシュ: \
universal character names(\u)じゃダメ?
>>307 cp932を指定したら'\'を0x5cで処理してくれました。
>>307 > GNU libiconv では規格バカが譲歩してくれない。
>>311 > いやしかし gcc 的にはどうであれ、
> 世間的には圧倒的に \ は円記号として使われてるわけで・・・
そうではないぞ。
>>288 >>294 >>297 の言う通り。
これだけじゃ理解できない人は、
http://euc.jp/i18n/ucsnote.ja.htmlの "6. ASCIIとJIS X 0201ローマ文字"を読むといい。
プログラムを書いている時でさえ、
YEN SIGN → REVERSE SOLIDUSと固定的に変換するとまずいのだ。(嗚呼神様)
ある時はYEN SIGN, ある時はREVERSE SOLIDUS。
それがShift_JISの0x5cの今までの使われ方。
規格ではYEN SIGNなのに。
納得のいかない話であるがこれが真実。
杓子定規に行くと
>>314 が正解。(ぐすん)
圧倒的シェアを誇っている Windows の CP932 が、0x5C を「見た目は円マーク」なのに「ファイル名、 パス等として使われる場合には ASCII のバックスラッシュと同じ」って扱いにしてるんだよね。 C / C++ その他昔ながらの応用ではみんなそうか。 今後どうなるべきなの? UTF-8 対応のエディタ使って、0x5C はバックスラッシュで入力(表示もバックスラッシュ)、 円マークはえーとコード分からないけど Unicode の円マークで入力(表示も円マーク)となるべき? 素直に EUC 使って\は2バイトで書くほうがいいような気が・・・
やっとcygwinでPCHでけた。 234のソースを使用 3.3.1 $ time g++ test.cc real 0m8.416s user 0m1.211s sys 0m1.201s 3.4.0 $ time /usr/local/xp/bin/g++ test.hh real 0m2.160s user 0m1.702s sys 0m0.470s $ time /usr/local/xp/bin/g++ test.cc real 0m1.593s user 0m1.011s sys 0m0.560s
>>234 cygwinではggc-common.cの中のmmapでoffset指定があるところが問題
ggc-common.cの中では
#undef HAVE_MMAP_FILE
する。
なぜか、mmapが使えなくてもいい様にコーディングしてあるのに
その中の処理が全くないので処理を追加する。
追加する場所はhooks.cの中の
hook_void_void ここで適当な大きさのメモリを確保 実行時に2回呼ばれるので注意
hook_voidp_size_t_null 確保したメモリのアドレスを返す
hook_bool_voidp_size_t_false 確保したメモリのアドレスと同じかと大きさを確認する。
ggc-common.cのneeds_readの判定後の処理がおかしいので
if (needs_read)
{
if (fseek (f, mmi.offset, SEEK_SET) != 0
/*|| fread (&mmi, mmi.size, 1, f) != 1*/)
fatal_error ("can't read PCH file: %m");
fread(addr,mmi.size,1,f);
}
上のように書き換える。
以上
>>328 レスありがとうございます。
早速やってみます。
結果報告はのちほど。
>>328 hooks.cは
>>331 のようにしてみましたが
g++: 内部エラー: Segmentation fault (プログラム cc1plus)
完全なバグレポートを送ってください。
と言われてしまいました。
ひたすら fprintf() をはさんで調べたところ、
どうやら ggc-page.c の clear_marks() の内側のループの
size_t num_objects = OBJECTS_IN_PAGE(p);
でこけているようです。
どこが間違っているんでしょうか?
void *buffer_used_for_PCH_on_cygwin = NULL; #define BUFFSIZE_FOR_PCH_ON_CYGWIN (1<<24) void hook_void_void (void) { if (buffer_used_for_PCH_on_cygwin == NULL) buffer_used_for_PCH_on_cygwin = xmalloc(sizeof(BUFFSIZE_FOR_PCH_ON_CYGWIN)); } void * hook_voidp_size_t_null (size_t a ATTRIBUTE_UNUSED) { return buffer_used_for_PCH_on_cygwin; } bool hook_bool_voidp_size_t_false (void * a ATTRIBUTE_UNUSED, size_t b ATTRIBUTE_UNUSED) { if (buffer_used_for_PCH_on_cygwin != a && a != NULL) { fprintf(stderr, "OTL\nbuf: %p\na: %p\n", buffer_used_for_PCH_on_cygwin, a); exit(1); } if (BUFFSIZE_FOR_PCH_ON_CYGWIN <= b) { fprintf(stderr, "orz\nb: %d\n", b); exit(1); } return true; } #undef BUFFSIZE_FOR_PCH_ON_CYGWIN
>>330 ggc-common.cで
#undef HAVE_MMAP_FILE
を入れてる場所がよくないような?
includeがすべて終わった後にundefしてみて
>>332 そうしてるんですけどダメです。#undefする場所をいろいろ試してみたんですが、
#include "config.h"
#include "system.h"
...
#include "hosthooks.h"
// ******** ここに入れたり ********
#ifdef HAVE_SYS_RESOURCE_H
# include <sys/resource.h>
#endif
// ******** ここに入れたり ********
#ifdef HAVE_MMAP_FILE
# include <sys/mman.h>
# ifdef HAVE_MINCORE
/* This is on Solaris. */
# include <sys/types.h>
# endif
#endif
...
#ifdef ENABLE_VALGRIND_CHECKING
...
#endif
// ******** ここに入れたり ********
やはり状況は変わらずです。只今ほんのり自棄になってconfigureの
#define HAVE_MMAP_FILE 1
を消して configure → make bootstrap 中です。
>>333 hooks.cの追加した処理があってることと
#undef HAVE_MMAP_FILE
が有効になっていれば
if (needs_read)
{
if (fseek (f, mmi.offset, SEEK_SET) != 0
/*|| fread (&mmi, mmi.size, 1, f) != 1*/) <−−−コメントするのを忘れるとOUT
fatal_error ("can't read PCH file: %m");
fread(addr,mmi.size,1,f); <−−−ここを通過するはず
}
>>334 そこは通過するんですけど、その後の ggc_pch_read() で
Segmentation Falte
なんです。
>>336 gccをmakeし直したらヘッダーファイルを再度PCHしないとだめだよ。
hook_void_voidで確保したアドレスが違うとエラーになる可能性がある。
gccのオプションで構造体のメンバ間をpaddingさせないようにする オプションは何ですか?
>>337 attributeで可能だったような気がする。info読め。
>>337 struct foo {
chara;
shortb;
intc;
} __attribute__((__packed__))
configureが違うからか? $ /usr/local/xp/bin/g++ -v Reading specs from /usr/local/xp/lib/gcc/i686-pc-cygwin/3.4.0/specs Configured with: ../gcc-3.4.0/configure --enable-languages=c,c++ --enable-libgcj --enable-threads=posix --with-system-zlib --enable-nls --without-included-gette xt --enable-interpreter --enable-sjlj-exceptions --disable-version-specific-runt ime-libs --enable-shared --host=i686-pc-cygwin --target=i686-pc-cygwin --prefix= /usr/local/xp Thread model: posix gcc version 3.4.0
>>342 かもしれませんね。
それでやってみます。
やり直してもダメでした。
>>345 ありがとうございます。
ダウンロードさせていただきました。
報告は後ほど。
わくわく
あ、わくわくされてる。 報告はたぶん明日以降になると思います。 (きっとすごく単純なとこではまってたんだろうなぁ)
Segmentation faultが起こった分かりました。
hook_void_void()の領域を確保するところ↓(
>>331 から抜粋)で、
>#define BUFFSIZE_FOR_PCH_ON_CYGWIN (1<<24)
...
>if (buffer_used_for_PCH_on_cygwin == NULL)
> buffer_used_for_PCH_on_cygwin = xmalloc(sizeof(BUFFSIZE_FOR_PCH_ON_CYGWIN));
xmalloc(BUFFSIZE_FOR_PCH_ON_CYGWIN)
としてたつもりが
xmalloc(sizeof(BUFFSIZE_FOR_PCH_ON_CYGWIN)) // ** なぜかsizeof使ってた
としていたために充分な領域が確保されてませんでした。
"malloc()といえばsizeof"っていう癖がついてたんでしょうね、きっと。
激しくアフォでごめんなさい。
↓何事も無かったようにどうぞ
皮はシャッキリシコシコ 噛むと美味しいおつゆがピュッ
353 :
デフォルトの名無しさん :04/04/30 13:11
-finline と -finline-functions って同じ意味でしたっけ?
>>354 マニュアル類には-finlineについて記述がないんですが、指定しても
エラーにならんのですよね。
gcc -v --help
358 :
デフォルトの名無しさん :04/04/30 18:42
gccのoptionてアホだよな
>>358 日本語書くときに促音を省略してしまうキミもね。
>>359 日本語を書くときに助詞を省略してしまうキミもね。
オマエモナーって死語?
最近はオマエガナーがナウいです
最近のヤングにはオマエガナーがとてもナウいんです。
ナウなヤングage
ほとんどビョーキなスレはここですか
tree-ssaはいつメインラインと統合されるんですかね
tree-ssaって何?
>>371 ありがと、わかったようなわからないような感じです。
>>372 コピペした者として、喜んでいいのかよくわからないレスをありがとう。
たれかC++相談室のネタに答えてやれ
C++相談室はVC++マンセーのようだがgccのコード品質ってどのくらい?
あの例、gcc-3.4 だともうちょい良くなったりしないもんかなー
tree-ssaとやらが組み込まれたgccでの結果も見たいもんだ
FixedPoint f(1, 50); // 1.50 return f.i_; だけのコードなら、gcc-3.4 で pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp subl $16, %esp movl $1, %eax leave ret にはなるね。%esp の操作が無意味だが… 掛け算入ったやつはダメダメ。
>>379 サンクスコ
> 掛け算入ったやつはダメダメ。
gcc-3.3以前よりもっと駄目??
方や世界で一番大きいソフト会社の製品、方や歴史はあるとは言えただの ソフトだから当然と言えば当然。 でも、それがどの程度、普段書くコードの速度低下をもたらすかだけどね・・・ C++で数値計算やってる俺の場合、 インテルコンパイラが第一。わずかに劣ってgcc。めちゃくちゃ遅いVC7.1 ってところ。iccと同じオプションなのにVCは遅くて仕方がないんだけど なんか使い方間違ってるんかな? まぁWinなんてたまにしか使わないからgccだけでいいんだけどね。
gcc はオプションで結果が全然違うぜ! 自分の目的にあった適切なオプションを選択しろよ!
浮動小数点数値演算(複素sin/cos等あり)で速度 gcc3.0 << VC++6.0 -ffast-mathつけるとgcc3.0 ≧ VC++6.0 てなことがあった(もちろん最適化ありで)。 VC++6.0の浮動小数点は-ffast-math相当じゃないかと疑っている。 面倒くさいから試してないけど。
>>380 自分が試した範囲だと、gcc-3.4.0 だとオプションをどーやっても真面
目に掛け算するコードを吐いてました。
もちろん、一般的に gcc-3.4 のほうが最適化がダメ、ということでは
ないですけどね。gcc-3.3.x で __attribute__((always_inline)) を付
けないと展開されなかった関数オブジェクトが gcc-3.4.0 では指定な
しでも展開してくれるようになって、自分は嬉しい。
gcc使う奴はオプションを適切に設定していればいいわけで、 デフォルトで最適な状態はありえないと考えればいいのでは。
ひとつだけいえるのはintelもMSも他でさんざん儲けてるんだからコンパイラなんか無償配布しろって琴田 マジでそう思うのは俺だけ?
>>385 Intel も Microsoft もコンパイラは無償配布してますよ?
ここわ、GCCすれです。
そこを考慮して、改めて
>>391 さんどうぞ。
インテルのGCCはないの?
お見苦しい発言を失礼しました。
では改めて
>>392 さんどうぞ。
→↓ ↑←
iccのlinux版は無料だよ 確か。
このスレではgccマンセーのようですが、 件の最適化についてはgcc3.4でも改善されていないということでFA?
FreeBSDでインストールしようとしたけど駄目だった。動いた人居る?
3.4も3.5もNetBSDで普通に使ってます
400 :
デフォルトの名無しさん :04/05/03 14:55
>>395 > このスレではgccマンセーのようですが、
> 件の最適化についてはgcc3.4でも改善されていないということでFA?
gcc3.4のほうが悪化しているでFA.
>>399 コンソール画面からインストーラ起動するとログアウトする。
atermから起動するとaterm自体が落ちるんだけど。そんなことない?
402 :
デフォルトの名無しさん :04/05/03 17:03
>>384 >
>>380 > 自分が試した範囲だと、gcc-3.4.0 だとオプションをどーやっても真面
> 目に掛け算するコードを吐いてました。
$ rpm -qa|grep icc
intel-icc7-7.1-6
だと(最新版じゃないが)、mov $5, -4(%ebp) ひとつにコンパイルされました。
VC++と同じく問題なしですね。
403 :
デフォルトの名無しさん :04/05/03 19:57
数日前にUNIX板で質問したのですが、回答いただけなかったのでこちらでも質問させてください。 2度目の皆様すみません。 nmしたときやg++ -Sしたときに、コンストラクタやデストラクタに Foo::Foo[in-charge]() のように[なんちゃら]と注釈が入っている場合がありますけど、 これって何ですか?どこかに解説ありませんか? in-charge, not-in-charge, in-charge deleting などがあるようで...
真面目に掛けてほしい状況の方がふつーのプログラムでは多いんじゃないの? プリプロセッサだけでも計算できる定数じゃなくて変数をセットしたときの実動作では ほとんどネグれる程度だったり。そのコンパイラの苦手なソースにたまたま出くわしたという ことじゃないの?
>>403 libiberty/cp-demangle.c
/* Demangles and emits a <ctor-dtor-name>.
<ctor-dtor-name>
::= C1 # complete object (in-charge) ctor
::= C2 # base object (not-in-charge) ctor
::= C3 # complete object (in-charge) allocating ctor
::= D0 # deleting (in-charge) dtor
::= D1 # complete object (in-charge) dtor
::= D2 # base object (not-in-charge) dtor */
>>404 クロスコンパイルも視野にいれると、
定数のコンパイル時計算は意外と面倒で、
最適化(定数伝搬&ループ外移動)のことを考えるとあまり効果がない。
昔のgccは結構強引なことをやった時期もあって、
(doubleの交換律による定数まとめなど)
ずいぶんと批判されてましたね。
俺の場合、gccはVCより明らかに高速なことが多い。 でもiccには負ける。 CPU設計するときに少なくともCコンパイラは同時に開発するだろうから、 インテルが出すコンパイラが他メーカより遅いのは逆に問題ある罠。
gdbで実クロック数のカウント表示ってできないのかな?
今時のCPUはICEでも無理。
それはマルチスレッドの場合でパイプラインが深いだけならカウントできるだろ?
>>411 キャッシュヒットとか page fault もあるし、単一スレッドのプログラムでも
裏でクロック割り込みとか I/O まわりの割り込みが発生してるから。
>>410 君ICE触ったことないね。ICEじゃ無理だよ。直接CPUが載ってるわけだから。
HWで動いてるCPUのクロックをどうやってカウントするんだ?ロジアナもってくりゃできるけどな。
クロック数カウントするのはイン・サーキット・エミュレータじゃなくてボントのシミュレータじゃないと駄目。
むしろgdbの target sim に含まれて無いほうがおかしい。
>>413 Z80くらい昔のCPUのICEは出来たよ。
>>414 あのねメーカから出てるシミュレータ/デバッガでは当然できる機能なんだよ。
できなきゃ組み込みソフトなんて製品にならんぜ。
gdbがやってないのはそれはgdbの都合
>>416 当たり前でしょ。gdbの話してんのよ。アフォ?
>>415 ICE(エミュレータ) っていうのはハードウェアが載ってることは知ってるよね。
それをカウントしようとすると相当手間なのよ。
そんなことしなくても実効命令のクロックを順番に加算していけば算出できるんだよ。
だからシミュレータなら当然できる機能ってこと。
実際俺が使ってるSHやDSP(54X)デバッガにはその機能があるし。
>>417 クロック数のカウントの話をしてんのにハードウェアエミュレータの話をするところが間抜けだいってるんだよ
わからんのかね。馬鹿かお前。
>>418 > そんなことしなくても実効命令のクロックを順番に加算していけば算出できるんだよ。
そんな時代もあったなぁ…・・・
まともなシミュレータも知らん奴は紛らわしからコメントするな。
電波はコメントするな
さぁ、盛り下がってまいりました。
ICE?ナニソレおいしいの?
人間が作ったハードウェアのクロックも数えられないと思ってる時点でも一回勉強しなおしたほうがいいんじゃないか->421 それが評価できない時点でCPUの設計はできんだろうが。
>>421 君のCPUの設計はクロックすら不確定性関係が成立してて評価不能なようだな。
マルチCPUで複数クロックで動いてる場合はともかく単一クロックで動作してる場合 評価できない方がおかしい。できないと思ってる奴は手を抜いてる(抜かれてる)ことに 気づかないおめでたい奴。
>>427 単一クロックの元で動作してるという仮定の下でクロック数をカウントするってことだな。
>>427 > 単一クロックで動作してる場合評価できない方がおかしい
環境による。
プリエンプティブマルチタスク OS だとまず不可能だが、優先度順で実行タイミングを
完全に制御できるリアルタイム OS で、かつキャッシュヒットも完全に制御下における
なら見積もれる。
ただ正確な評価を行うためには CPU の外部仕様ではなく、内部仕様に関する詳細な
知識が必須だから gdb に期待するのはアレだ。
(・∀・)ニヤニヤ
>>429 ヲイヲイ。デバッガでOSの仕様を考慮してるものがあれば、教えてくれよ。
デバッガは通信機能はOS/モニタを意識してる。それをいうならソフトウェアシミュレータだな。 OSというのはあくまでオーバーヘッドがないことを前提としてる。というか時間計測するん じゃなくてクロック数で評価するんだから当然可能なはず初期キャッシュは当然ヒットなしが前提だろ。
(・∀・)ニヤニヤ 結局話についていけなくて笑っているしかございません。
当然すぎ
で、結局
>>409 はどういう環境で開発してて、なんで実クロック数のカウントを
とりたいと思ったんだ?
gdbの sim は HDLシミュレータでいうところの機能シミュレータなんだな。 実時間シミュレータ対応でない。 modelsimぐらいの機能は持ってくれるとうれしいんだが、 当然CPUメーカにはデバイス情報も開示して欲しいな。
>>436 それは当然必要だろ?それによって必要なリソースの条件が変わってくる。
例えばあるタスクを10mxで完了したい。そのとき何MHzのクロックを突っ込めば
よいかが設計段階で算出できる。ちなみに消費電流はクロックに対してリニアに
変化する。シビアなモバイル関係のエンジニアならだれもが経験してること。
10mA変われば製品に対する市場評価が変わる。
現状のgdbではその評価ができないってことだな。
×10mx -> ○10ms
>>438 CPUの命令数まで確定しているのに設計段階とはこれ如何に。
>>438 はぁ?君まともな製品開発したことないね?命令が確定して初めて、突っ込むクロックが決まるんだよ。
ちなみにロジックデバイスの周波数っていうのはMAXが決まってるだけで最低周波数に関しては
かなりの幅があるんだよ。PLLがなければ下限がないものもある。どれだけ低いクロックで済ませ
られるかが設計の腕の見せ所じゃねぇか。
442 :
デフォルトの名無しさん :04/05/04 18:00
(・∀・)ニヤニヤ
>>436 CPUぐらい固定してくれないと話進まないよね。
>>418 > そんなことしなくても実効命令のクロックを順番に加算していけば算出できるんだよ。
安いCPUばっかり相手にしているんですね。
どかーん! (⌒⌒⌒) || / ̄ ̄ ̄ ̄ ̄\ | ・ U | | |ι |つ U||  ̄ ̄ ||  ̄  ̄ もうおこったぞう
>>444 > 安いCPUばっかり相手にしているんですね。
それはそれで辛い仕事のような気がする。
>>444 なーんも知らんようだが、メモリのアドレスデコーダも外付け、
ユーザが直接触れるのは古典的なx86ベースのPentiumプロセッサを
使って設計することがどれほど面倒か、わかってるか?
ちなみにPentiumを搭載したPC以外の製品がどういう状況にあるか
わかって言ってるんだろうな?->学生ちゃんよ
実際Intelが一般に公開してる資料だけで、 gdb(じゃなくてもいいけど)に正確にクロック数える機能付けたせるのか? 無理だろ。 できるなら作ってくれよ。頭下げて使わせてもらうから。
>>447 だから、環境を先に特定しようよ
x86 で Win32 なのか、z80 で OS どころかモニタもない環境なのかで話がぜんぜん
違うんだからさ。
>>448 現状のGDBではファンクションシミュレーションしか出来ず、
実クロックシミュレーションに対応してない仕様であるということだけ。
CPUのクロックを"カウントできない"ってこととはまったく意味が違う。
>>449 だから、シミュレータのクロック数のカウントはOSには依存しないんだよ。
逆にOSのオーバーヘッドを考慮したシミュレータがあるなら教えてくれよ。
>>450 そもそも発端の
>>414 からして、無条件で「CPUのクロックを"カウントできない」とは
書いてないようだが。
>>414 > CPUのモデルごとにプロファイルを持って、
> CPUの内部を完全にエミュレートしないと。
CPU ベンダ以外がクロックを正確にカウントするのは無理だ、gdb にそれを期待するな
と言ってるだけでしょ?
>>451 Win32 みたいな環境で「クロック数」をカウントするのは意味ないからやめとけ、
という話だって。
ラウンドロビンではなく優先度順でスレッドを実行する環境でも、ハードウェア
アーキテクチャによっては意味ないし。俺が最近触ってるのは、メインメモリと
DMA コントローラが同一のバスを共有していて、しかも大量の DMA 転送を
行うのが前提のハードなんだけど、こういう状況だとメモリアクセスに要する
時間が予期できないから、厳密にクロック数を割り出すより実際のデータを
流しながらパフォーマンス測定せざるをえない。
で話が戻るが
>>409 は何でクロック数をカウントしたいんだ?
>>452 410、412、414、429 あたりの馬鹿のコメントをよく読め。出来ないとアフォがほざいてるだろ。
出来ないのは現状のgdbの仕様ってとだけ。
>>454 410 は ICE の話だし、412 は OS やモニタが介在する場合には正確にカウントできないと
条件をつけてるだけでしょ。残り二つも、一般に公開されている情報だけではカウントでき
ないから gdb では無理だと言ってるに過ぎない。
>>414 > CPUのモデルごとにプロファイルを持って、
> CPUの内部を完全にエミュレートしないと。
>>429 > ただ正確な評価を行うためには CPU の外部仕様ではなく、内部仕様に関する詳細な
> 知識が必須だから
Z80 とかならともかく、命令をいったん非公開のμop に展開してたり、分岐予測を行ってる
最近の CPU だと、そのメーカー以外は正確なクロック数は出せんでしょ。
>>445 ガキはスッコンでな。
>>453 シミュレータでもたとえば割り込みまでシミュレートできるものがあるが、
そんな機能を多用するより実物持ってきてポートたたいてロジアナでモニタしたほうが
手っ取り早いってことは経験上わかりきってるだろ。それでもクロック数がカウントできれば
アルゴリムの優劣や、コンパイラのコード品質を知る上でプロファイラなんかを動かすよりは
るかに正確な評価が出来るってことよ。ロジック設計手がけたことあるならわかると思うが、
ファンクションシミュレートだけではきわめていい加減な評価でしかできない。フリーのHDL
コンパイラ/シミュレータが普及しないのもこのせい。
キャッシュヒットミスの見積もりに、 OSというかソフトウェアが影響する例だと、MIPSのR2000,R3000辺り。 ミスした時のハンドラはソフトウェアで記述だから。
どうでもいいが この話題はスレ違いじゃないのか?
>>458 その辺もプラットホームによりけりなんだよな。
小さいながらも命令キャッシュを持ってる CPU だと、コードから静的に算出される
見かけのクロック数より、関数の配置の方が効いたりする。パフォーマンスカウンタ
で命令キャッシュミスを集計しながら、手作業で関数を並び替えたヤな思い出が。
>>456 例えばXilinxははメンターにディバイスの遅延情報を公開してるし、
一般ユーザでもそれの情報を入手できる。クロックだけでなくクロックに
対する遅延評価もできる。逆にそれが出来なきゃ設計は出来ない。
技術敵に出来ないことと、仕様としてやってないことを正確に分けろってことよ。
>>460 お前には言ってることの1割もわからんだろうからごみコメント入れるな。
gdbってクロック精度まであるシミュレータの組み込みって出来ないんだっけ?
>>456 gdbではH8もサポートしてるんだが。
このスレではマルチスレッドCPUに対応した gcc しか相手にしません。
マルチスレッドCPU
>>464 できる。
デバッガ部分とシミュレータ部分は結構疎遠。
(・∀・)ニヤニヤ
>>(・∀・)ニヤニヤ そういう意味ありげな言い方せずにはっきり指摘すればどうよ。というか的確な指摘できないんだろ。
>>471 スレ違いな話題はよそでやれってことじゃ?
>>471 gcc - gdb の話は決してすれ違いじゃないよ
「マルチスレッドCPU」とやらの話はスレ違いだろ
マルチスレッドを効率よく機能させるのにコンパイラが対応しないでどうするんだ?
>>463 > 例えばXilinxは
話の流れが理解できてないのか ?
それとも、単に知識を披露したいだけ ?
gccの最適化はIntelのやVC++よりもショボいという結論でいいよね。
しょぼいというか最適化処理そのものにバグがあるから使えない
>>476 >>463 の書いてる程度のことを知識のひけらかしと思う時点でお前がエンジニアとしての常識なさ杉
>>479 唐突に「Xilinxはは」なんて書かれても、うざいだけだよ。
知らないことを書かれてしまって何もまともなコメントできずにウザイと捨て台詞吐くしかないわな。
>>477 407読め。Visual C++なんて7.1になってようやくまともになっただけ。
>>478 -O2でLinuxカーネルもFreeBSD全システムもコンパイルして大丈夫
>>482 i386しか使ったことない犬厨か。
他のarchで-O2してみろよ。バグバグだから。
>>483 そういうのを最適化そのものにbugがあると言うのか?
君は言うんだろうな。あーこりゃこりゃ
>>481 ププッ、逆切れ ?
で、なんで Intel じゃなくて、Xilinx の話を唐突に出すの ?
>>483 H8で-O2つけて問題なく使ってるよ。
>>483 それは特定のアーキテクチャ向け最適化でバグがあるだけじゃないの?
そのアーキテクチャの仕事する人は災難だが、一般化するほどのことでもない。
>>483 て言うか、どのアーキテクチャでどういうバグが書けない時点で、単なる煽りにしか見えないぞ。
日本で最初に製品にXilinxを採用した俺から言わせれば
>>463 はまるでスレの流れを理解できていない勘違い野郎
>>日本で最初に製品にXilinxを採用した俺から言わせれば 当時のFPGA採用するような製品だから試作か実験機のたぐいだな。おーっとそれ製品にして金とってたって? そりゃぼったくりでしょ。レベルの低いESレベルの製品世に出してることを公表して恥さらすなって!
>>483 gccってi386より前に68kでの実績があったことすら知らないみたいだね。
>>490 別にすべての製品が常に量産品というわけじゃないだろ。
俺の所でも、公的機関や親会社が使う試作品を設計/製造することもあるよ。
買う方から見れば試作品なんだろうけど、売る方としては一応製品だからね。
そういうのはころころ仕様が変わったりするし、納期とかもシビアだからある意味ぼったくるのは当然。
だってリスクがあるからね。
悔しかったらあんたもそういう仕事見つけて、ぼったくれるようになれよな。(藁
>>490 大量生産しか知らんのか?
たった1台しか生産しない製品なんてのもめずらしくないし
そうゆう業界での話。
まぁぼったくってるのには間違いないな。
じゃ、言わせてもうおう。 >公的機関 多分NTTあたりのことを言ってるのかな? 君が試作までしか手がけてないからそれで終わりと思ってるかもしれないが、それを使って規格作るための実験したり 最終的にはメーカにおいて量産までこぎつけてそれで利益を上げられるからこそボッタくり価格でも君のところに発注してるわけよ。 まぁ、量産する前には必ず試作フェーズがあるし、試作でシビアな実装も考えずにFPGAをいじってるのはそれは非常に 楽しいが電気屋として一番醍醐味あるのはやっぱりASIC起こすことだよ。RFの実装屋とかは違うこと言うだろうけどね。 >悔しかったらあんたもそういう仕事見つけて、ぼったくれるようになれよな。(藁 自営でもやってるの?そりゃ大金手にできるだろうし、俺も大金は欲しいが経営の才能なんてないもんでな、 あくまでもサラリーマンとして一定の給料定年までもらう方でやってくよ。それでも開発設計のダイナミズムを楽しんでるよ。
↑大手のリーマンでつか?
>>495 492じゃないからNTTとか自営とかわからないが・・・
489の製品とは、”ある物”の製造装置で、携帯装置のようなシビアな実装などは不要な世界。
納品先に納めた段階では試作品のような物だが、現場で最終調整をしてそれがそのまま製品となってしまう。
そんな造り方なんでフィールドでのリコンフィギャブル性に目を付けたわけだよ。
10年以上経つけどいまだに大手メーカーで稼動してます。
スレ違いにつきこれにて終了
498 :
デフォルトの名無しさん :04/05/09 02:05
g++3とgdbで、例外が送出されたらbreakするにはどうすればいいんでしょうか? catch throw はサポートされていないようなんですが。
>>498 __cxa_throw あたりにブレークポイント
>当時のFPGA 電気スペックはともかくよく割れたな。 割れるというより、パッケージの背着が不十分ではがれるもの多数でびっくらこいた。Maid in Korea なんてこんなもんと思ってたらこの有様・・・鬱
>>499 できました。ありがとうございます。
catchされたらbreakは可能でしょうか?
GCC関するスレでスレ違いのframe warになってるスレはここでつか?
503 :
デフォルトの名無しさん :04/05/09 02:57
frame workの話をしているんでつ。
>>501 __cxa_begin_catchじゃねーか?
egrep get_identifier $(GCC)/gcc/cp/except.cしてみ。
他にも、__cxa_call_unexpected, __cxa_end_catch, __cxa_rethrow,
__cxa_allocate_exception, __cxa_free_exception こんなん出てきます。
506 :
デフォルトの名無しさん :04/05/09 18:24
gcc.gnu.orgdj?
>>506 つか、実体のsources.redhat.comがdj
508 :
デフォルトの名無しさん :04/05/10 03:30
-O[0-3]それぞれで、どの-f...フラグが有効になるのかを調べる方法はありますか? 3.4.0で-O3を使うと、いたるところでInternalCompileErrorが発生するので、 その原因となる最適化フラグだけ無効にしたいのです。
man gcc
$(GCC)/gcc/toplev.cの parse_options_and_default_flags()
>>508 -fverbose-asm でコンパイルして.sの先頭のコメントを見るってのはどうよ?
ミス。 -fverbose-asm -S だ
Globalっていうソフト見てて思ったんだけど、 なんでGCCのパースしたデータを活用しないの? なんでGCCのアドインみたいな形で作らないの? VC++ユーザとしてはその辺り不可思議
ようやく使えるようになったVCユーザとして不思議なんだよな。
みなさん、ありがとうございます。 -fverbose-asm -Sで見る方法が手軽で解りやすかったです。
>>513 作者が別だから。。。
と言うかgccのパース結果(正確にはcc1等の出力)は
プリプロセッサの処理結果を元にしているから
Globalの様にソースコードの原型が必要な場合には適さない
これでいいか?
>と言うかgccのパース結果(正確にはcc1等の出力)は >プリプロセッサの処理結果を元にしているから >Globalの様にソースコードの原型が必要な場合には適さない なるほど
Globalの#if〜の扱いは結構凄いぞ。
パッチうpして〜!
>>520 Cygwin か MinGW のメーリングリストにぽいっと
>>522 が教えてあげてよ。
本家の3.5.0でmmapに依存しない場合にも対応しようとしているみたいなので
それが出るまで待って見るのもいいかも?
MinGW用にはcygwin用にでっちあげたパッチだけじゃ不十分で
fopenを"w+"でファイルアクセスしているところでこけてます。
"w+b"に変更して、fcloseする手前でエラーになっているところを
コメントアウトすると一応PCH出来るようになりますよ。
assert 関数自作して、その中でコールスタックを表示したいのですが、 コールスタックを自作するとなるとかなり面倒な事になります。 (関数の始まりと終わりと return を全部いじる必要があるので) GCC 3.3.2 使ってるんですけど、何かいい関数とか用意されてませんかね?
素直にデバッガ使いなさい
UNIXなら、 sprintf(buf, "gdb -x scriptfile %d", getpid()); system(buf); じゃダメかねえ。(scriptfileにはwhere)
debuggerでいいならabort()してcore dumpする。
>>525 __builtin_return_address(LEVEL)じゃダメなの?
>>529 おおっ! リターンアドレスが取得できますね。
あとはそのアドレスがどの関数内にあるのかが分かればいいのですが...。
>>526-528 gdb の使い方よく知らないもんで...。
やっぱ勉強した方がいいですかね?
531 :
デフォルトの名無しさん :04/05/14 14:23
527に書いてあるじゃん
フリーのGUI,devcppが最強すぎる・・・
Dev-C++ 4.9.8.9、クラスブラウザで例外出まくりじゃね?
4.9.8.9入れてない。 早速ホムペ行ってくる
537 :
デフォルトの名無しさん :04/05/16 17:47
>>532 > nlist()
/usr/include/linux/a.out.h:struct nlist {
これですか?なにするもの?
なんで、man nlist とかやってみようと思わないんだろうか... ?
539 :
デフォルトの名無しさん :04/05/16 18:07
> なんで、man nlist とかやってみようと思わないんだろうか... ? 犬酎なんでmanしてもみつからず。
>>541 Debianだけど、libelfg0-devを入れたら/usr/include/libelf/nlist.hがあった。
> Debianだけど、libelfg0-devを入れたら/usr/include/libelf/nlist.hがあった。 んで、なにしるものだった?
ナニゲに親切なDQN発見
nlist()じゃコールスタックは見れないと思いマスがね;-)
>525 gdbなんてコマンドいくつか覚えれば使えると思うけど。 覚えようとしないで、わざわざ手間掛かる方法を独自に 試すの事はあなたの人生に潤いを与えますか?
>>547 常にgdb上で動かせるケースばかりとは限らんだろが
アタッチもできないのか?
>>546 こっちだろ。
>>530 > あとはそのアドレスがどの関数内にあるのかが分かればいいのですが...。
アスペクトC++でも使えよ
555 :
デフォルトの名無しさん :04/05/16 21:32
557 :
デフォルトの名無しさん :04/05/16 22:15
健康に悪そうだな、おい。 まあ、プログラミングよりましかも知れんが。
>>フリーのGUI,devcppが最強すぎる・・・ どこが最強なんだか・・・ あんなの使いもんにならんよ
むつかしい
562 :
デフォルトの名無しさん :04/05/17 05:56
>>978 >C言語なら俺に聞け!の次スレ立てて
それすらもできないようでは、C言語も(ry
>>559 コンパイラはMingwだし、何か問題でも?
ソースはフォントとかカスタマイズすれば割といける
フリーのGUI,Eclipseが最強すぎる・・・
567 :
デフォルトの名無しさん :04/05/18 03:44
Cygwin+gccで、バイナリーデータのみのピュアなファイルを作成したいのですが、どうしたらよいのでしょうか。 例えば、 struct SAMPLETYPE { int a; int b; }; SAMPLETYPE hoge[] = { { 1,2 }, { 3,4 }, { 5,6 }, { 7,8 } }; のような、構造体の配列データ【のみ】のソースから、配列サイズと【全く同じ大きさ】のデータファイルを作りたいと思っています。 gcc ??? ??? sample.cpp のように、コマンドラインのみでファイルを作成することはできるのでしょうか。
#include "sample.cpp" (略) n = fwrite(hoge, sizeof(struct SAMPLETYPE), sizeof(hoge)/sizeof(struct SAMPLETYPE), f);
>>568 データファイルを作成する c プログラムを作って実行する。
>>569 すみません、書き忘れていたのですが、
「コンパイル環境はあるが、実行環境がない」という
特殊な状況のため、fwriteが使えないのです。
ですので、コマンドラインのみでどうにかならないかなーと思いまして。
intのsize, structのpadding, byte orderが合っていれば、 ローカルの環境でやってしまえばいいでしょう。 また、違っていてもプログラムで何とでもなりますし。
具体的な話になりますが、 1つのソース(配列データが書かれたもの)から、エンディアンが違う2種類のバイナリーデータを つくりたいと考えています。 異なるプラットフォーム(MacとWinとか)でも、基本的にプログラムのソースコードは共通化したいので、 プログラムでエンディアンを解決するというのはやりたくないのです。 1)共通プログラムソース→それぞれのプラットフォーム用にコンパイル→それぞれのプラットフォーム用実行バイナリ 2)共通データソース→それぞれのプラットフォーム用にコンパイル→それぞれのプラットフォーム用データ ということができればいいと考えているのですが。
>>573 >プログラムでエンディアンを解決するというのはやりたくない
じゃあ変換ICとかでも作れば?
データファイルを作成するプログラムで > intのsize, structのpadding, byte order に対処すればいいだろ。
というか、これgcc関係ないよ。C言語初心者スレ行きだな。
じゃあ、諦めな。
>>573 「それぞれのプラットフォーム用にコンパイル」のところで、gcc しか使えないの?
make とか perl とかは? perl でやれば?
>>577 は私ではないですが、まあ、いっか。
構造体のサイズがかなり大きく、かつ、各メンバの構成が複雑だったり、
アラインメントなど、コンパイラ依存な部分も多いかと思ったので、
プログラムで解決することはしたくなかったのです。
また、プログラムが、ファイルから読み込んだメモリをそのまま構造体データとして
使う仕様だったので、プログラムソースと同じ結果を吐くコンパイラでバイナリデータを
作成する必要があると思い、質問しました。
とりあえず、
gcc -c test.cpp -o test.o
objcopy -O binary test.o test.bin
のように、objcopyを使うことでなんとかなりそうです。
いろいろありがとうございました。
>>580 それポインタどうするの?
変数定義が複数あっても大丈夫?
>>581 > それポインタどうするの?
典型的なのが、
char *strs[] = { "This", "is", "a", "test", };
ですね。
char strs[][5] = { "This", "is", "a", "test", };
なら、なんとかなりますが。
>>581 >それポインタどうするの?
ポインタやリンカ解決が必要なデータは含まれない仕様なので、大丈夫でした。
構造体自体は複雑なのですが、内容はすべて数値、かつ、変数定義が1つなので、
先頭からのオフセットさえ正しければOKだったので。
では。
GCCの生成するコードの、ABI資料はありません?
ABIの何が知りたいの?
何のABIが知りたいの? 例: i386 の関数呼び出しのABI、C++ の例外ハンドリングのABI
>>585 ,586
そのものズバリです、i386の関数呼出ABIです
>>587 おお!素晴らしい!読んでみますです
C関数コール時にに各レジスタの内容を、アセンブルコード側
で保証しなくてはならないのか、GCCの吐くコード側で保証
されるのか知りたかったのです。それとEBP(フレームポインタ)の扱いも~
(gcc -S foo.c で出力されるコードでは、(E)AX以外の内容も保証されていませんでしたが
VCの吐いたPEコードを逆アセンブルした時は、呼出先で保証していた気が...)
アセンブルするのは不慣れなんで、ABI仕様を読めば、
その辺りの規定が書いてあるんじゃないかと考えた次第です
どうもDebian上のGCC3.3.3 で -Os -O3 を付けた場合、
書いたコードの挙動が怪しくて...
最適化に左右されないCコードの呼出を行うには、
関数呼出規定を熟知しておこうと...
まとまった文章は読んだことないけど、i386 だと eax, ecx, edx が関数内で壊していいレジスタ、 ebx, esi, edi が関数内で変えちゃいけないレジスタ。 これは、Windows でも *BSD でも Linux でも同じはず。 gcc-3.3.x のソースだと、gcc/config/i386/i386.h の CALL_USED_REGISTERS の値かね。 こういうのって、Intel が決めたのかなあ?
>>589 ふつうCPUメーカが決める。大抵CPUのマニュアルに書いてあるよ。
>>589 なんてコッタ、EAX,ECX,EDXって保証する必要無いんですね..
Intelアーキテクチャマニュアル上巻見直します...
>>gcc-3.3.x のソースだと、gcc/config/i386/i386.h の
>>CALL_USED_REGISTERS の値かね。
gcc -S -fcall-saevd-ecx -fcall-saved-edx -fcall-saved-ebx foo.c
で、 指定レジスタ使用時にpush/popされるのを確認しました
-fcall-used-reg で破壊可能レジスタとなるそうです。
アセンブル時に、保護したいレジスタはスタックフレーム
にセーブしなくてはならないってことですね
まずはマニュアルを見直します
位置独立コードってなんでしょうか?(-fPIC) いまいち意味がわかりません。
>592 その名の通り、メモリ上のどのアドレスにロードされても問題ないような コード。通常実行効率が微妙に悪くなるが、代わりに同一のバイナリ イメージを複数のプロセスで共有できるようになる。 DLL とか共有ライブラリを作るときに使う。
>>593 >その名の通り、メモリ上のどのアドレスにロードされても問題ないような
>コード。通常実行効率が微妙に悪くなるが、代わりに同一のバイナリ
>イメージを複数のプロセスで共有できるようになる。
>DLL とか共有ライブラリを作るときに使う。
Thanx.
もし仮りに、共有ライブラリ生成時に-fPICしなかった場合は、
そのライブラリを使用した時に落ちてしまうんでしょうか?
.oにrelocatableって書いてないと、ldが怒るから.soは作れない。
>>595 なるほど、ようやくわかりました。
Thanx
現在、オーバレイ技術に関する勉強している者です。 オーバレイ技術って仮想メモリ全盛の今となっては、 もはや使用されないのですか、あるいは必要ないのですか? それと、コンピュータの階層上(レイヤ)では、オーバーレイは どのレイヤで実行されるのですか?
まずはあんたの言ってる「オーバーレイ技術」とは何? GCCスレで聞くからには、LDのOVERLAY指定のこと? 使用例や必要性を知らずに勉強してるの?想像しにくい状況だな。 さしあたってあんた本人が必要としてるわけじゃないのか? どのレイヤと聞くからには、あんたの考えてるレイヤを列挙してもらわないと。 しかし、どんなレイヤがあるかは、マシン、システム、ソフトごとで様々なはずだ。
599 :
デフォルトの名無しさん :04/05/24 01:33
どなたか、-fasynchronous-unwind-tables って何するものだか教えてくださいませんか?
>>598 >まずはあんたの言ってる「オーバーレイ技術」とは何?
>GCCスレで聞くからには、LDのOVERLAY指定のこと?
そのとおりです。
>使用例や必要性を知らずに勉強してるの?想像しにくい状況だな。
わからないからこそ調べてるんです。
>さしあたってあんた本人が必要としてるわけじゃないのか?
さしあたって必要ではないです。でも、さしあたらないとだめなんでしょうか?
>どのレイヤと聞くからには、あんたの考えてるレイヤを列挙してもらわないと。
>しかし、どんなレイヤがあるかは、マシン、システム、ソフトごとで様々なはずだ。
様々なレイヤで存在することすらわからなかったものですから。
マシンとシステムの区別がよく分からないんですが。
レイヤがソフトであるなら、やはりローダがオーバレイ作業をするのが一般的なんですか?
>597 オーバーレイが有効に使えるのは、 1 主記憶が狭い 2 仮想記憶がない 3 主記憶と比べて大きな二次記憶がある (これは read only のことが多い) という場面。小さな RAM と、それより大きめの ROM で構成されてるシステムだと 使い道があるが(ゲーム機とか)、最近はハードウェア資源が豊富になってきて るから、使う場面は少なくなってきてるんじゃないかなぁ。 メモリが増える割合に比して、コード量の増加って緩やかだから。あと、オーバーレイ で解決せずに実行時リンク (Win32 だと DLL, UNIX なら *.so) で対応する方法も ある。こっちの方が柔軟。
>>602 ありがとうございます。
>1 主記憶が狭い
>2 仮想記憶がない
>3 主記憶と比べて大きな二次記憶がある (これは read only のことが多い)
なるほど。
これを見てて思いついたのは、組み込み系で使われる可能性がありますね。
>メモリが増える割合に比して、コード量の増加って緩やかだから。あと、オーバーレイ
>で解決せずに実行時リンク (Win32 だと DLL, UNIX なら *.so) で対応する方法も
>ある。こっちの方が柔軟。
オーバーレイで解決せずに実行時リンク?動的ライブラリのことですかね。
そもそもgcc環境では、オーバーレイor実行時リンクの作業はカーネルがするって事?
オーバーレイの言葉の定義をしてくれー
>>604 >オーバーレイの言葉の定義をしてくれー
自分がいろいろ調べて見てわかっているオーバーレイの定義は、
「少ないメモリ上で、ある関数をコールする度にオーバレイマネージャ等が
実行ファイル等から読み込み、メモリに再配置して効率的にメモリ割り当てを扱う事」
という認識でいます。間違ってますでしょうか?
>>603 > そもそもgcc環境では、オーバーレイor実行時リンクの作業はカーネルがするって事?
gccは中立です。
>605 > 「少ないメモリ上で、ある関数をコールする度にオーバレイマネージャ等が それは GNU LD で実現してるオーバーレイとは違うぞ。 関数呼び出しの度に自動的にファイルを読み込むのではなく(それは遅すぎ)、 手作業で これから foo(), bar() を読み込むから、foo(), bar() を含むコードを メモリ上に読み込み 完了後に foo(), bar() をコール とする。 オーバーレイを有効に使うためには、プログラムを同じタイミングで呼ばれる 可能性がある複数の部分に *手作業で* 分割し、さらに読み込みタイミングを 自分で制御する必要がある。 メモリ上に読み込んでない関数をコールすると、プログラムが実行時に 吹っ飛ぶか、もしくはメモリ上に展開されている別のコードを実行して、 謎の挙動を示すことになる。
>>605 > ある関数をコールする度にオーバレイマネージャ等が
> 実行ファイル等から読み込み、
これはある実装の機構であって、オーバーレイの定義ではないのでは?
> メモリに再配置して
ほとんどの場合、実行時に再配置もしないのでは?
再配置できるくらいなら"OVERLAY"する必要がないからね。
メモリ上のある領域をモジュール同士で共有して、排他的に利用するのが、
(たぶんあなたの言っている)オーバーレイだと思います。
オーバーレイをgccで行う方法の話じゃないんならば、
くだ質にいった方がいいんじゃない?
>> 「少ないメモリ上で、ある関数をコールする度にオーバレイマネージャ等が
>それは GNU LD で実現してるオーバーレイとは違うぞ。
え、そうなんですか。もう一度GNU LDのオーバーレイを調べてみます。
>オーバーレイを有効に使うためには、プログラムを同じタイミングで呼ばれる
>可能性がある複数の部分に *手作業で* 分割し、さらに読み込みタイミングを
>自分で制御する必要がある。
これは、そのプログラム作成者がその作業をするってことですか?
>これはある実装の機構であって、オーバーレイの定義ではないのでは?
すいません。オーバーレイの定義についてまだあやふやでした。
>メモリ上のある領域をモジュール同士で共有して、排他的に利用するのが、
>(たぶんあなたの言っている)オーバーレイだと思います。
その通りです。
>オーバーレイをgccで行う方法の話じゃないんならば、
>くだ質にいった方がいいんじゃない?
そうですね。もう一度調べなおします。
Thanxでした。
>>607 ,
>>608
>
>>605 > > ある関数をコールする度にオーバレイマネージャ等が
> > 実行ファイル等から読み込み、
>
> これはある実装の機構であって、オーバーレイの定義ではないのでは?
昔アセンブラで書いたプログラムを自動的に↑とするリンカ使ったことある。
L80の互換リンカで、P?L80って名前…
LINK86互換のもあったはず。
>>613 この本はベストセラーだね。いい本だ。翻訳は良くできてるのかな?
この本を読んで全部理解するにはかなりの基礎知識を必要とするよ。
>>616 あっち移ったら、あっちでお付き合いするけど
こっちはスレ違いだからね。
>>613 >関連ドキュメントが少なすぎるぅぅぅ(泣
確かに少ないな。特に日本語のドキュメントで探すのは皆無に近い。
欧米では関連ドキュメントを探すとちゃんと見つけ出せるけど日本特有の現象なのかわからんが、
ある技術(例えばLinker & Loader)を使っているなら、その概念や動作や設計とかの資料があってもいいはずなのに、
「車輪の再発明なんかやるんじゃない」的な考えで、その関連資料を作成すること自体しなくなるのは
とてもよくない現象だと思う。
長々とスマソ。
GCCは(・∀・)イイ! ヽ(゚∀゚)ノGCCバンザイ!!!!
最近、typeofが手放せなくなりつつあるんだが、 これなんとか標準C++の範囲で実現する方法はないの? ちょっとすれ違いか。
あの、すいません gccのコンパイルオプションを紹介しているサイトを 教えていただけませんか?
>622 info 読め
>>622 googleでgcc infoを検索すれば、gccのinfoの日本語訳が見付かることだろう。
隠しオプション -fno-gates MSVC用のpragmaを発見するとそのソースファイルを削除する
-fno-stallman GPL/LGPLライセンスのソースファイルを(ry
しばらくは3.3をずっと使い続けるかな
昔のgccでpragma使うとゲームを起動するって本当だろうか……。
hack -> rogue -> ハノイの塔 ってやつか。 オレも気になる。
今gcc-1.42落としてみたらcccp.cに例のコードがあったよ。
execってオーバーレイみたいなもんだよね??
でもinfoの説明と食い違ってるoptionあったりするしな。>gcc info読んでも変だと思ったらsource読んで確認するのを勧める。
>632 なにをもって「みたい」とするかに依るが。内部実装は天と地ほど違う。
>>631 マジなんだ……。さんきゅ。俺も落としてみるか。
>>635 俺も思わず確認してしまった。
1.42の頃はstallmanがガンガンいじってたのねぇ。
あるソースを見てたら以下のコードがありました。 これってどういう意味ですか? "!!"って使用できましたっけ? if (!!var1 == !!var2) return 0;
>>637 C言語くだ質スレが適当だと思うが一応。
!e → (e) ? 0 : 1
!!e → (e) ? 1 : 0
つまり!!は、0(false), それ以外(true)の0, 1への正規化。
その使い方だと、var1とvar2の(C言語的)真偽が同じならです。
flag | (!!(式) << 4)
なんてのは良く使います。
>>637 素直にこう書いた方が判りやすいと思うのだが・・・
if(var1 && var2)
return 0;
>>639 それだと
var1 が 0 かつ var2 が 0 の場合に動作が異なる。
if (!var1 == !var2) return 0; これでいいような気がする。 違うのかな?
>>643 プログラマじゃないけど本当に分からない。
違い教えて。
>>644 じゃあプログラマになれるよう、勉強しようね(w
>>645 おれも分らない。int型みたいな0(false)とそれ以外(true)の
{0,1}への正規化なら、
>>642 でいいように思うんだけど。
>>647 真偽が逆転するので、正規化目的なら!!だろう。
ただ、件の場合は比較しているだけなので、真偽逆でも問題なし。
>>645 早く教えてください
if (!var1 == !var2)
if (!!var1 == !!var2)
この違いを教えてください。漏れには真偽が逆になっていて
見難いから、!!としているだけにしか見えません。
ああ、正規化、という意図を表現したいなら!!がいいね でもそれならマクロか何かにしてほしい
>>651 単にあなたが見慣れてないだけじゃない?
!!というのは特徴的だし昔から使われているから、
イディオムとして受け入れる方が変なマクロ定義するよりいいと思うけど。
俺は (var?1:0) をするイディオムとして !!var を認識しているので、
if (!var1 == !var2)
よりは
if (!!var1 == !!var2)
の方が素直に読める。
>!!というのは特徴的だし昔から使われているから、 はつみみです:-)
652みたいなのがロートルって呼ばれるようになるんだろうナァ
gcc-3.4.0 で、 gcc ディレクトリで grep -n '!!' * とかやった結果、 c-decl.c:3634: constp = !! (specbits & 1 << (int) RID_CONST) + TYPE_READONLY (element_type); c-decl.c:3636: = !! (specbits & 1 << (int) RID_RESTRICT) + TYPE_RESTRICT (element_type); c-decl.c:3638: = !! (specbits & 1 << (int) RID_VOLATILE) + TYPE_VOLATILE (element_type); c-decl.c:3639: inlinep = !! (specbits & (1 << (int) RID_INLINE)); c-parse.c:1854:#define YYRECOVERING() (!!yyerrstatus) collect2.c:824: no_demangle = !! getenv ("COLLECT_NO_DEMANGLE"); cppexp.c:320: result.unsignedp = !!(type & CPP_N_UNSIGNED); cppexp.c:407: overflow = !!(num.high >> (PART_PRECISION - shift)); cppexp.c:593: result.unsignedp = !!unsignedp; cppfiles.c:629: if (CPP_OPTION (pfile, deps.style) > !!sysp && !file->stack_count) cppfiles.c:742: bool print_dep = CPP_OPTION (pfile, deps.style) > !!sysp; cppspec.c:169: + !!o_here + !!lang_c_here + !!lang_S_here; cpptrad.c:714: bool recursing = !!(node->flags & NODE_DISABLED); expr.c:7398: return !!(the_word & bitmask); */ gcov.c:818: arc->on_tree = !!(flags & GCOV_ARC_ON_TREE); gcov.c:819: arc->fake = !!(flags & GCOV_ARC_FAKE); gcov.c:820: arc->fall_through = !!(flags & GCOV_ARC_FALLTHROUGH); gengtype-yacc.c:429:#define YYRECOVERING() (!!yyerrstatus) hard-reg-set.h:95: (!!((SET) & (HARD_CONST (1) << (BIT)))) hard-reg-set.h:125: (!!((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT]\ ra.c:431: something_spilled = !!WEBS(SPILLED); real.c:3043: encode_ieee_extended (fmt, buf+!!FLOAT_WORDS_BIG_ENDIAN, r); real.c:3138: decode_ieee_extended (fmt, r, buf+!!FLOAT_WORDS_BIG_ENDIAN); 一部、みやすいように、削りましたが、ほんとにろーとるなんでしょうか???
たったそんだけ?
もちつけ ロートル呼ばわりされかねないのは、 「昔から使われているから、イディオムとして受け入れろ」 という下りのところだろ。
ロートルって何だと思ったら 中国語で老人の事なんだ(;´Д`)
!!x って、 x != 0 と全く同じ(xが整数型の場合)でしょ? 正規化する場合でも、x != 0 が使われる場合の方が多いんじゃないかな。 少なくとも、俺はそうしてる。 俺はその方が読み易い(理解しやすい)し。
君は、ね。
一般的に目的がはっきりしている方が読み易いと言える 目的が0との比較なのか正規化なのかよく考えて使い分けるべし
663 :
デフォルトの名無しさん :04/05/29 14:26
D言語ってサポートされるの?
外国人と仕事するようになって どっちも英語が出来ないので 仕方なくコードで会話するんだが 相手に意図を伝えられるコードを 意識して書くようになると それだけでバグって減るモンなんだね
#define fuck head
ダミアソ
fuck head って、どじなやつという訳なんだな。
うーん、ロートルと言われればロートルなのかも。 Cとは12のころからかれこれ15年くらいつきあってるからなあ。
>>655 そう言えば、!!を始めて見たのはgccだった。
gcc-1.2くらいだったか?
!!についての話題は直接gccに関係ないので、他のスレでやってくだされ。
!!うるせーぼけ!!
まだ、夏休みじゃないよな。
最近は、常時夏休みみたいな奴がいるからな。
675 :
デフォルトの名無しさん :04/06/02 23:50
MinGWとこれの配布元が提供しているbinutil、gccのソースコードと レッドハットのnewlibのソースコードをターゲットM68000でコンパイル して、クロスコンパイル環境構築できますか? (やったことのある人がいれば教えてください) H8のクロスコンパイル環境の情報は多いんですが、M68000の 情報がほとんどないもので。 よろしくお願いします。
>MinGWとこれの配布元が提供しているbinutil、gccのソースコードと Win32上でbuildしてる奴ほとんどいねぇと思う。 オレがやってみた感想。 だってあそこのbison使い物にならんし、 素直にコンパイル通すだけでもツール類自力でmakeしないといかんし。
>>676 情報サンキューさんです。
多分これと同じ要領でコンパイルできそうですね。
MinGWというのが気になっているんですが、実際にやってみれば
どうなのかわかるかな?
>>677 そうですか。クロスコンパイル環境を整えるにはやっぱり
UNIXやLinuxつかったほうがいいんですかね...。
bison1.8が改悪なんだなぁ。Win32上でのmake失敗の原因はこれだし。 スケルトンファイルをsendmail.cf化しようなんて何考えてんだか。 設計を改めず拡張してどんどこ改悪していくのはGNUの悪い癖。
どんどこ
>>675 聞くばっかりじゃなくて、実際にやって見れば
痛い目にあった方がスキルが上がる気がするけど
>>681 >bison1.8が改悪なんだなぁ。Win32上でのmake失敗の原因はこれだし。
「最初からWinなんて眼中無かった。」に500000カノッサ
>>683 そうですね。実際にやってみたほうがいいですね。
週末になれば時間が確保できるのと、試せる環境が
つかえるようになるのでやってみようと思います。
MinGWでだめだったらCygwin、それでもだめだったら
最後の手段でLinux...といきたいところですが、色々な
都合でそんなに時間がかけられないかもしれないです。
本当は市販のコンパイラを買ってもいいんですが、
gccを使うのはスキルアップも目的です。本当は
少し時間をかけてチャレンジしたいんですけどね。
漏れも最近MinGW相手にクロスコンパイラ編成しますた。 ぶっちゃけ、イバラの道ですた。 Cygwinと比べてコミュニティの規模が小さいせいか、自前で解決しなきゃ ならんネタが多いんですよ。 MinGWのダウンロードページから落とせるtar玉には大抵MinGW用のパッチが あたってるので、迂闊にGNUのページとかから落としてくるより楽なんだけど、 それでもビルドできないシチュとかが結構ある。 特にクロスコンパイル編成だと、configureが混乱するのか、時々わけのわからん ヘッダを持ってこようとしたりして、激しく混乱が加速するです。 ビルド済みパッケージには、大抵ポーティングリスト(元のパッケージから 何を変えたか)が添付されてるので、使わなくても落としてくるのが吉。 /usr/doc以下にドキュメント追加されます。 gdbがシリアル接続受け付けなかったり、明らかに消しちゃいかん機能を 消して無理矢理ビルド通してたりするので、いまいち信用ならないけど。 漏れ的に困ったのは、gccがfork等posixの関数を要求してくるところとか。 collect2とかが引っかかるので、Makefileから外してしまうので一応解決するます。
>>686 本家MinGWのメーリングリストでも
「collect2でひっかかるけどどうすんの?」
「collect2はMinGWのパッケージには公式に入ってないよ。
これをどうするかどうかは過去に何回か議論しているからログ読め」
というやりとりがあったようですね。
あの、ついでにmakefileの修正箇所なぞを大雑把に
晒してもらえると大変助かるんですが。
だめですかね?
ああ、英語の意味がやっといまわかりました。 過去ログ読めってことか。 うっかり、collect2が公式パッケージに入っていない 理由について述べられているんだと勘違いしてしま いました。
まったく関係ないが、C++ の場合、 bool operator!() const をクラスに定義して、 if( !!obj ) と使うことがある。
>>689 メンバ関数ポインタを使う手もある。これだと整数型への暗黙の型変換が
できないから、ケアレスミスを防げるし。
class foo
{
void dummy();
public:
typedef void (foo::*unspecified_bool_type)();
operator unspecified_bool_type() const {
return xxx ? &foo::dummy : NULL;
}
};
>>690 ところでなんでC++ってNULLを予約後にしなかったんだろう。
null(NULLではない)を予約語にする動きはまだある。
694 :
デフォルトの名無しさん :04/06/05 12:17
gccのオプション-fomit-frame-pointerについて質問です.
gccのマニュアルを見ると
(例えば,
http://gcc.gnu.org/onlinedocs/gcc-3.3.3/gcc/Optimize-Options.html#Optimize%20Optionsなど )
最適化オプション-Oを指定すると,-fomit-frame-pointerは自動的に指定されるように思われます.
しかしながら,世のgcc向けのソースを見ると,
最適化オプション(-O,-O2,中には-O6なんてのもある.効いているのか?)と-fomit-frame-pointer
を併せて指定している例を多々見掛けます.(例えば,Linuxカーネルのソースなど.)
これは,一体どういうことなんでしょう?
プログラマの勘違いなんでしょうか.
あるいは,昔は-Oが-fomit-frame-pointerを自動的に指定していなかった時期とかあるんでしょうかね?
ご存知の方いらっしゃいますでしょうか?
環境依存でそうだった
>>694 つーか,お前さんの示してるgcc-3.3.3のマニュアルでも,まだ,環境依存じゃん(w
>on machines where doing so does not interfere with debugging
ダマサレター
>>695 x86では,-fomit-frame-pointerを有効にするのに
-Oと別に,明示的に指定する必要があるのでしょうか?
>>694 > 最適化オプション-Oを指定すると,-fomit-frame-pointerは自動的に指定されるように思われます.
??? 英語力がないのか ?
だったら
http://www.excite.co.jp/world/english/ とか使えよ。
英) -O also turns on -fomit-frame-pointer on machines where doing so does not interfere with debugging.
日) -Oは、さらにそうすることがデバッギングに邪魔をしない機械上で―fomit構造ポインターをつけます。
>>697 オプションの指定を最適化したいのか ?
フレームポインタ付けたくないなら指定すればいいと思うが。
>>698 あぁ,すみません.
上の方にはそう書いてありますね.
もっと下の-fomit-frame-pointerの項目の
> Enabled at levels -O, -O2, -O3, -Os.
ばっかり見てました.
697の質問については,多分,
-Oと-fomit-frame-pointerを併記するソースが多いということが
その答えを物語ってるんでしょうね.
>>699 > オプションの指定を最適化したいのか ?
はい.
CPUはPentium3で,今んとこ,
-O3 -march=pentium3 -msse -mfpmath=sse -fforce-addr -funroll-loops -fomit-frame-pointer
を付けてコンパイルしています.
やっているのは浮動小数点演算中心の計算です.
他にお勧めとかあったら,是非お教えて下さい.
>>701 厳密なエラー処理が必要ない場合は -ffast-math も利く。
>>702 -ffast-mathはなんとなく恐くて敬遠してましたがこの際理解しようと思います.
-ffast-mathで設定されるオプションのうち,いくつかが良く分かりません.
オプションによって結果が変わる短い例を示してもらえないでしょうか?
以下はだいたい分かります.
-fno-math-errno: errnoが設定されなくなる.
(e.g.)
$ cat test.cpp
#include <iostream>
#include <cmath>
#include <errno.h>
using namespace std;
int main () {
double d0 (-1);
cout << sqrt (d0) << " " << flush;
perror (NULL);
return 0;
}
$ g++ -O test.cpp; ./a.out
nan Numerical argument out of domain
$ g++ -O -ffast-math test.cpp; ./a.out
nan Success
-funsafe-math-optimizations: 計算精度がユーザからはコントロール不能な最適化が行なわれる.
以下がいまいちよく分かりません.
-fno-trapping-math
-ffinite-math-only
-fno-signaling-nans
(因みに私の環境はg++ 3.3.3 on Linux 2.4.26)
>>703 -fno-trapping-math
IEEE 754 では、演算結果が非数 (0/0 とかの場合) や無限大など「ふつー
じゃない数」になった場合に割り込みを発生させ、事前に登録した割り込み
ハンドラに制御を移すことが可能になっている。
この割り込み処理がないことを前提にして最適化を行う。
-ffinit-math-only
演算結果が非数や無限大にならないことを前提にして最適化を行う。
-fno-signaling-nans
これは -fno-trapping-math のサブセットで、非数の場合に割り込みが
発生しないことを前提とする。無限大などでは割り込み発生させても OK。
>>704 丁寧なレスをどうもありがとうございます.
> -fno-trapping-math
> -fno-signaling-nans
これ,UNIXだとシグナルで通知されるんですよね.たぶん.SIGFPEだと思い,
#include <iostream>
#include <signal.h>
using namespace std;
void func (int number) {cout << "SIGFPE occured " << number << endl;}
int main ()
{
if (signal (SIGFPE, func) == SIG_ERR) exit (1);
double d0 (0), d1 (0);
cout << (d0 / d1) << endl;
for (;;)
pause ();
return 0;
}
ってなコードを書いてみましたがfuncが呼ばれません.
まぁ,いずれにしても事前に割り込みハンドラを登録したプログラムでない限り,
-fno-trapping-mathの有無で動作が変わることはないということですよね.
> -ffinit-math-only
> 演算結果が非数や無限大にならないことを前提にして最適化を行う。
これがまだ分かりません.
結果が変わってくるような例ってないですか?
>>705 がなんか変なコードになっている.
for (;;)は抜いて下さいまし.
>>705 > まぁ,いずれにしても事前に割り込みハンドラを登録したプログラムでない限り,
> -fno-trapping-mathの有無で動作が変わることはないということですよね.
確か OS によりけりだった気がするけど、694 の環境ではその理解で問題ない
かと。あとシグナルハンドラ中で呼べる関数には厳しい制約があるので、stream
とか操作すると不味いです。念のため。
> 結果が変わってくるような例ってないですか?
b = a + 1.0 - 1.0;
a が極めて大きな数の場合 a + 1.0 の段階で +Inf になってしまい、
結果的に b = Inf ( != a) ってケースがありえる。無限大にならない
と仮定すれば a = b; と最適化しちゃって OK。
みなさんのアドバイスのおかげで無事、M68Kクロスコンパイル
環境が構築できました。ありがとうございました。
どうやらcollect2問題はMinGWで配布されている3.4系には
パッチがあたっているようです。
その他にも色々問題はありましたが、基本的にMinGWの
メーリングリストとgoogleで解決しました。
bisonやflex、gettextやlibiconvといったものは、
http://sourceforge.net/project/showfiles.php?group_id=23617 からダウンロードしました。
(これらをインストールするときはインストール先のパスにスペースが
入っていると駄目なのにはまりましたが)
707様,レスをどうもありがとうございます.
>>704 > IEEE 754 では、演算結果が非数 (0/0 とかの場合) や無限大など「ふつー
> じゃない数」になった場合に割り込みを発生させ、事前に登録した割り込み
> ハンドラに制御を移すことが可能になっている。
環境依存の話になってくるかも知れませんが(もし,他に適切なスレがあれば誘導をお願いします.),
このような数学的例外が起こった場合に実行する割り込みハンドラって
どうやって登録するのでしょうか? ご存知の方いらっしゃいますでしょうか?
ぐぐってみたらmatherrってのがそれっぽい感じがするのですが,使い方が分かりません.
man feenableexcept C99 floating point rounding and exception handling
>>707 > b = a + 1.0 - 1.0;
> a が極めて大きな数の場合 a + 1.0 の段階で +Inf になってしまい、
> 結果的に b = Inf ( != a) ってケースがありえる。無限大にならない
> と仮定すれば a = b; と最適化しちゃって OK。
ん〜,どんな類の最適化が起こりうるか,雰囲気は伝わってきたんですが,この例ですと,
「a が極めて大きな数の場合 a + 1.0 の段階で +Inf になってしまい」
これがそもそも「無限大にならないと仮定」するしないに関わらず,
浮動小数点数では起こり得ないのではないでしょうか?
aが極めて大きな数の場合に,a+1.0は丸められてしまうので上記仮定に関わらず常にb != Inf ( == a)
になると思います.試しに,以下のようなものを書きました.冒頭のoutput_as_bitsはビットダンプする関数です.
#include <iostream>
#include <bitset>
template <class T> std::ostream & output_as_bits (std::ostream &p_os, const T &p, bool ascending_order = true) {
bitset <sizeof (T) * 8> p_bit; const char *pp (reinterpret_cast <const char *> (&p)); char byte_digit (1);
for (size_t i (0); i < p_bit.size (); ++ i) {
p_bit.set (i, static_cast <bool> (*pp & byte_digit));
if ((i + 1) % 8) byte_digit <<= 1;
else {byte_digit = 1; ++ pp;}
}
if (ascending_order) {
p_os << "L"; size_t i (0);
while (i != p_bit.size ()) {p_os << p_bit.test (i); ++ i;} p_os << "H";
} else {
p_os << "H"; size_t i (p_bit.size ());
do {-- i; p_os << p_bit.test (i);} while (i != 0); p_os << "L";
}
return p_os;
}
(続く)
(711の続き) int main () { double d0 (1); while (true) { d0 *= 2; if (d0 == (d0 + 1)) break; } output_as_bits (std::cout, d0) << " " << d0 << std::endl; output_as_bits (std::cout, d0 + 1) << " " << (d0 + 1) << std::endl; return 0; } 結果: L0000000000000000000000000000000000000000000000000000111111000010H 1.84467e+19 L0000000000000000000000000000000000000000000000000000111111000010H 1.84467e+19
>>711 確かに。+1.0 ではなく + FLT_MAX / 2 ぐらいにしたほうが現実的だったかも。
本当はこれで結果に差が出てくれば,納得するんですが....
$ cat test.cpp
#include <iostream>
#include <bitset>
#include <cmath>
using namespace std;
typedef double Type;
template <class T> std::ostream & output_as_bits (std::ostream &p_os, const T &p, bool ascending_order = true);
const Type limit (numeric_limits <Type>::max ());
const Type half_of_limit (limit / 2);
template <typename T> T func1 (T p) {return p + half_of_limit;}
template <typename T> T func2 (T p) {return p + half_of_limit - half_of_limit;}
int main () {
Type d0 (limit); Type d1 (func1 (d0)); Type d2 (func2 (d0));
output_as_bits (cout, d0) << " " << isinf (d0) << " " << d0 << endl;
output_as_bits (cout, d1) << " " << isinf (d1) << " " << d1 << endl;
output_as_bits (cout, d2) << " " << isinf (d2) << " " << d2 << endl;
return 0;
}
$ g++ -O2 test.cpp; ./a.out
L1111111111111111111111111111111111111111111111111111011111111110H 0 1.79769e+308
L0000000000000000000000000000000000000000000000000000111111111110H 1 inf
L1111111111111111111111111111111111111111111111111111011111111110H 0 1.79769e+308
$ g++ -O2 -ffinite-math-only test.cpp; ./a.out
L1111111111111111111111111111111111111111111111111111011111111110H 0 1.79769e+308
L0000000000000000000000000000000000000000000000000000111111111110H 1 inf
L1111111111111111111111111111111111111111111111111111011111111110H 0 1.79769e+308
う〜む.同じだ.最初の実行結果の3行目がinfであって欲しいんですが.
>>710 ありがとう御座います.学ぶ足掛かりができました.
>>714 x87 だと FPU は 80bit あるののに double は 64bit だから、マジメに
計算しても FPU 内部ではオーバーフローしないような気がする。
FPU を 64bit モードにするか拡張精度浮動小数点数 (long double)
で試してみては?
あと gcc はマニュアルに書いてあることが完全に実装できてないことも
あるので、これで動作に疑問があるようなら gcc のソースを読んだ方が
良いかも。
>>715 > 拡張精度浮動小数点数 (long double)で試してみては?
714の冒頭のtypedef double Typeをtypedef long double Typeにしてやってみました.
$ g++ -O2 test.cpp; ./a.out
L111111111111111111111111111111111111111111111111111111111111111101111111111111100000000000000000H 0 1.18973e+4932
L000000000000000000000000000000000000000000000000000000000000000111111111111111101111111111111101H 1 inf
L000000000000000000000000000000000000000000000000000000000000000111111111111111101111111111111101H 1 inf
$ g++ -O2 -ffinite-math-only test.cpp; ./a.out
L111111111111111111111111111111111111111111111111111111111111111101111111111111100000000000000000H 0 1.18973e+4932
L000000000000000000000000000000000000000000000000000000000000000111111111111111101111111111111101H 1 inf
L000000000000000000000000000000000000000000000000000000000000000111111111111111101111111111111101H 1 inf
今度は,両方とも溢れちゃいました.
どうやらこの例では-ffinite-math-onlyによる,演算順序の変更は行なわないようです.
まぁ,でも-ffinite-math-onlyが何をする可能性があるかは理解できました.ありがとう御座いました.
(良い例が思い付いたらお教え下さいね.)
> これで動作に疑問があるようなら gcc のソースを読んだ方が
> 良いかも。
そうですね.
717 :
デフォルトの名無しさん :04/06/09 05:34
サンクスコ
719 :
デフォルトの名無しさん :04/06/11 00:03
gccの最適化オプションで-march=pentium4としたら-mmmx、-msse、-msse2も自動的にONになるんですか?
それはさすがにならんだろ cmovとかは使うだろうけど
なる
722 :
デフォルトの名無しさん :04/06/11 00:55
-fverbose-asm
gcc-3.3.1
gcc/config/i386/i386.c
{"pentium4", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2 |
PTA_MMX | PTA_PREFETCH_SSE},
バージョンによっては違うかもしれないので
ttp://gcc.gnu.org/cvs.html で確認してみては?
>>722-724 なるほど、ソースコード読んでみるという手がもっとも確実ですね。
ありがとうございます。
>>721 「なる」ってなるほどのことかと思ったよ。
なる
で、結局の所どーだったのよ。
「バージョンによって違うかもしれない」
その日の天気による
晴れの日はコンパイルしよう
732 :
デフォルトの名無しさん :04/06/12 22:05
WindowsXPのコマンドプロンプトから c:\cygwin\bin\g++ ../test.cpp (c:\cygwin\bin\g++ ..\test.cpp) (c:\cygwin\bin\g++ ..\\test.cpp) としても cc1plus: ../test.cpp Not Such File or Directory とでてコンパイルできないのですが、何がいけないのでしょうか? 以前はこれでできていたはずなのですが...。
>>732 c:\cygwin\bin\ls ..
は?
>>733 動きました。
実行しているディレクトリ名に日本語が含まれていたのが
原因だったみたいです。
>>734 今の最新版だとそうなる。1.5.9-1までならOK。
おっと。cygwinのバージョン、な。
>>735 >>733 ,735さん ありがとうございます。
なるほどそういうことでしたか。
もうバージョンあげちゃったんで
次期バージョンでは直っててホスィ
構造体の配列がグローバル変数で定義されているとして、別のソースファイル中で その配列を参照する場合には、まずそのファイル中で配列をextern宣言しますよね。 このとき、extern struct foo[3]と配列の個数を明示してやらないと、 参照した時点でSIGSEGVを食らいます。(少なくともgcc-3.2.2の場合) 単にextern struct *fooでも良いと思ってたんですが、これってgcc-3.2.2のバグ ですか、それともCの仕様ですか? 少なくともextern struct *fooでもコンパイル オプションに-Wallとか付けても問題なく通ります。
>>738 ここにもポインタ変数と配列を混同している人が。。。
>>738 頭の悪い脊髄反射レスは要らない。
extern struct foo[]としても、SIGSEGVを食らう。
なぜ、構造体のアドレスが正常に渡されないかが問題なのだ。
例えば、配列中の構造体の大きさが、実際に宣言されるまで不定で
あるような場合(構造体内部にchar *のような文字列のポインタを含む場合)、
コンパイラは間違ったポインタを渡してしまう可能性が考えられる、
とかそういうふうな答えを期待した。
C言語スレに池
答える知識がないなら黙ってればいいのに。
>>740 煽るんなら、アンカーぐらいちゃんとしないと、自分で自分が「頭の悪い脊髄反射」とカミングアウトしてることになってるぞ。(藁
それはそれとして、
extern struct foo[3];
extern struct *foo;
extern struct foo[];
でコンパイルエラーにならない、GCC のバージョンを教えてくれ。
手元の、2.95.4 は全部シンタックスエラーにしやがるからな。(藁
>>743 君も配列とポインタ変数を混同していないかい?
gccにはバージョン3以降で構造体(あるいはそのメンバ)のアドレス計算を間違うバグがあったんだがね。 それを知っていれば、配列とポインタ変数をどうこうなんてレスは返さないと思われ。 例えばfoo[2].bar.len++とすると、関係ないメモリをインクリメントしようとしていた 事がある。これをfoo[2].bar.len += 1と書くとなぜか回避できた。 答えられないなら、黙ってていいよ。
>>744 こりゃ失礼。
って言うか、そういう問題じゃないんだけどね。
>>745 そういう問題じゃなくて、一体 foo の型って何 ? って言う話なんだけどな。
(わざわざ「シンタックスエラー」とまで書いてあるのにわからんかな...。)
>>746 そういう個別のバグ ? の話までするんであれば、問題のソースと -S の結果を貼った方が早いと思うが。
>>746 はぁ?
配列を外部参照しにいくにもかかわらず、extern struct *fooと
書いてることが問題であって、アドレス計算は関係ないと思うのだが?
>>746 「答えられないなら、黙ってていいよ」
こんな台詞吐くやつは大概厨房と決まってるんだがな。
GCCのアドレシングのバグなぞを持ち出してきているが、それ以前の問題だ。
char c_ary[10] の型は char* ではないということだよ。
実際のソースは長いので、要約するとこんな感じ。 -- c.h -- typedef struct { int len; char *str; } lascii; -- sample1.c -- #include "c.h" lascii foo[3] = { {3, "abc"}, {4, "defg"}, {5, "hijkl"} }; extern int hoge(); main() { hoge(); } -- sample2.c -- #include "c.h" extern lascii foo[]; // ここでfoo[3]とすれば無問題 int hoge() { printf("%s\n", foo[2].str); }
配列中の構造体が全て同じ大きさであることが保証されているならば配列で 宣言することは無理もない事だけど、ある程度のメモリ容量が必要だったり 構造体の大きさがまちまちならば、ポインタで宣言しておいて、malloc()で メモリを割り当てるだろうな。
>>750 少なくとも、そのソースは 2.95.4 なら問題はない。
他のまともなコンパイラでも問題はないはず。
お前の使ってるバージョン固有の問題、もしくはお前の環境の問題と思う。
もしこのソースでエラーになるなら、sample2.c の -S の結果を貼ってくれ。
>>751 > ある程度のメモリ容量が必要だったり
何が言いたいのかよくわからん。
日記なら、ご自分の日記帳にでも書いておけよ。
大量の配列を宣言するくらいなら、ポインタで変数を宣言してmalloc()でメモリを 割り当てるでしょうな。 「ポインタと配列は違…」とか叫ばれてもね。そんなことは聞いてないし、言わ なくていい。それは今問題にしてない。問題かもしれないが。 構造体の配列をextern宣言する時に配列数を含めておかないと正しい参照が 出来ないのはどういうことなのか、を気にしているの。 コンパイル時にアドレスが不定で決定できないならば、エラーなりワーニングを 出せば済む事なのだが、-Wallなどを付けても問題なく通る。
>>753 >>751 のソースは問題ない。それで動かないならコンパイラのバグ。
* fooで動かないのは当り前。それで動くと思うのはおまえの頭のバグ。
>>753 > コンパイル時にアドレスが不定で決定できないならば、エラーなりワーニングを
> 出せば済む事なのだが
リンク時の話だからコンパイラには何もできないでしょ。
しかし
>>738 にextern struct *fooとはっきり書いてるし。
>>738 > 単にextern struct *fooでも良いと思ってたんですが、
配列の不完全型を理解してないんでしょうね。
言語を知らんヤツがコンパイラを語るってイタイよな。
ポレは、警告を「ワーニング」って呼ぶ奴を、「あぁ、ばかなんだな」と思うことにしてるんだが。
>>759 なぜ?
「ワーニング」ではなくて何と呼ぶんだ?
まさかとは思うが「ウォーニング」とか言うなよ。
放置でおながいします
>>761 >放置でおながいします
当たったのかよ。藁
「わーん」の方がアップアップしてる感じが良いなぁ。
ワーンヽ(`Д´)ノing
ウォーヽ(`Д´)ノning
アハーンヽ(`Д´)ノping
>>766 >アハーンヽ(`Д´)ノping
ムシロ意味がわからん。
エロ画像
769 :
デフォルトの名無しさん :04/06/15 19:51
gccとは直接関係ないのですが、お願いします。 clispというパッケージをコンパイルしていて以下のようなエラーが出ました。 gcc -W -Wswitch -Wcomment -Wpointer-arith -Wimplicit -Wreturn-type -Wno-sign-compare -O2 -fexpensive-optimizations -DUNICODE -DDYNAMIC_FFI -I. -I../../ -c linux.c linux.c: In function `module__linux__init_function_2': linux.c:434: error: `sigpause' undeclared (first use in this function) linux.c:434: error: (Each undeclared identifier is reported only once linux.c:434: error: for each function it appears in.) make[1]: *** [linux.o] Error 1 ここで疑問なのですが、Makefileからコンパイラへ渡される変数の一覧は どのように探したらいいのでしょうか?-DXXXというオプションがここでは 二つほど渡されていますが、他にどのような値があるのか知りたいと思います。
-E プププ...Makefileから渡される変数など存在しない
make -n とかやって眺めるのが簡単じゃないの?
clispのlinux.cはこのようになっています。 #include <signal.h> ・・・ void module__linux__init_function_2 (module_t* module) { ・・・ register_foreign_function((void*)&sigpause,"sigpause",1024); つまりLibcの関数をあるテーブルに登録してると思われる処理です。 またclispのパッケージにはsignal.hというファイルは存在していません。
signal.hのsigpauseに関する場所はこのようになっています。 ここにコピペした場所以外にはsigpauseは記されていません。 /* The `sigpause' function has two different interfaces. The original BSD definition defines the argument as a mask of the signal, while the more modern interface in X/Open defines it as the signal number. We go with the BSD version unless the user explicitly selects the X/Open version. This function is a cancellation point and therefore not marked with __THROW. */ extern int __sigpause (int __sig_or_mask, int __is_sig); #ifdef __FAVOR_BSD /* Set the mask of blocked signals to MASK, wait for a signal to arrive, and then restore the mask. */ extern int sigpause (int __mask) __THROW; # define sigpause(mask) __sigpause ((mask), 0) #else # ifdef __USE_XOPEN # ifdef __GNUC__ extern int sigpause (int __sig) __asm__ ("__xpg_sigpause"); # else /* Remove a signal from the signal mask and suspend the process. */ # define sigpause(sig) __sigpause ((sig), 1) # endif # endif #endif ここで__FAVOR_BSD=FALSE,__USE_XOPEN=FALSEだったらエラーになりますよね。
>>773 770が言うように-Eしてみたら手掛かりになるのでは?
Glibc-2.3.2では上の__FAVOR_BSDのところが__USE_BSDになっています。 これってGlibc,GCCの環境設定,clispのどれが悪いと思われますか? glibc-2.3.4,gcc-3.4とあたらしめのものなので、バグがあるのは当然です。 $gcc -E -I. -I../../ linux.cをしてみました。 sigpauseが含まれているのは以下の箇所だけ。 extern void psignal (int __sig, __const char *__s); # 149 "/usr/include/signal.h" 3 4 extern int __sigpause (int __sig_or_mask, int __is_sig); # 178 "/usr/include/signal.h" 3 4 extern int sigblock (int __mask) ; register_foreign_function((void*)&sigpause,"sigpause",1024); となると、上の/usr/include/signal.hと比べれば、やはりGlibcがおかしいっぽいですね。
どっちか define しないと sigpause が宣言されないんなら、clisp の Makefile (or configure) が悪い、ってことになるかね。 なんにしても、gcc はまるで関係ない。
>>777 もしも、君の書き込みが
『ほら、やっぱりウォーニングじゃん!』
という意図ならば、相当痛いぞ。
clispの全てのヘッダーファイルの中から#undefしてるところを探しても、 __FAVOR_BSD,__USE_XOPEN,__GNUC__は一つもなし。通常はこれらの値は Glibcでは/usr/include/features.hにてシステムの値として設定されるようです。 で/usr/include/features.hの該当箇所を見ると、以下のようになっています。 /* These are defined by the user (or the compiler) to specify the desired environment: __STRICT_ANSI__ISO Standard C. _ISOC99_SOURCEExtensions to ISO C89 from ISO C99. _POSIX_SOURCEIEEE Std 1003.1. _POSIX_C_SOURCEIf ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2; if >=199309L, add IEEE Std 1003.1b-1993; if >=199506L, add IEEE Std 1003.1c-1995 _XOPEN_SOURCEIncludes POSIX and XPG things. Set to 500 if Single Unix conformance is wanted, to 600 for the upcoming sixth revision. _XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions. ・・・ _BSD_SOURCEISO C, POSIX, and 4.3BSD things. ・・・ 多分エラーの原因はclispのMakefileにて、glibc-2.3.4用に上記の値のBSD関連、 もしくはXOPEN関連のどちらかを設定する必要があるということだろうと思います。 質問はこれからです。"(or the compiler)"とあるコンパイラの設定とはGCCの 場合はどこを見ればいいのでしょうか?specsには %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT} という1行だけが含まれていましたが、他にもどこかにあるのでしょうか?
補足ですが、 gcc-3.3.3のspecsには以下のようなものも含まれていましたが、 %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} 自分のところの3.4にはこれすらなくなっていました。
gccと関係ないって。だから犬厨しつこいって言われるんだよ。 森へお帰り
このスレはワーニング派が多いの?
ホントシツコイナ、答えはもう出てるだろ These are defined by the user お前は盲目か?ベンダ依存の制御マクロだろこれ 文句があるなら、GCCじゃなくてディストリビューターに言え
>>782 正直どっちでもいいの
日本人じゃちゃんと発音できないから
発音と日本語での書き方は別物。 warpをウォープとかwarrantyをウォーランティとか言う奴はアホ。
カタカナ語にいちいちつべこべ言う香具師は け い こ く とでも言い直せよヴォケ 日本語の会話中に突然 warning って発音の単語が出てきたらふつー引くだろ?
787 :
アルロビュー ポッキュ ヤングギゴッポム!!! :04/06/16 01:17
白人に劣等感丸出しの朝鮮人が一人紛れ込んでヲメくヌレはここでつか? 「マクドナルドは」「メッドゥネルドゥ」じゃないから チォックバリドル英語下手ニダとかほざく連中と変わらんて virus を「ヴァィラス」に近い発音されてきちっと理解できる奴どれくらいいるんだ? しかも日本語の会話の文脈で
面接中にイオナズンとかもな
こんなポレでも、cosは「コサイン」って読んじゃうけどな。
>>780 3.4では__GNUC__等はgcc内部で定義されてるよ。
よくわからんが
linux.cの先頭で
#define __USE_XOPEN
とすれば、エラーは無くなるんじゃない。
読み方なんてどうでもいいじゃん。 それよりも、gccのオプションを1つでも覚えれば。
おまいら -Werror がコンパイル通るまで帰しませんよ
>おまいら -Werror がコンパイル通るまで帰しませんよ 先生!通ったんで、もう帰っていいですか?
>>794 >キャストの嵐かよ!!!
ちがうよ。人聞きが悪いこと言うなぁ。
もともとのコードが良いからさ。
>>790 ありがとうございます。
linux.cにて
#define __USE_XOPEN 1
#include <signal.h>
としてみましたが、なぜか
>>769 と同じエラーが出ます。
/usr/include/*とclispのパッケージ全てのソースにおいて#undef __USE_XOPEN
しているところを探しても、features.hにて行われているのみ。
いろいろ試してみた結果、
$gcc -D_GNU_SOURCE -I. -I../../ -c linux.c
と_GNU_SOURCEをつけた時だけコンパイル成功。謎です。
この時はソース中に__USE_XOPENを付ける必要すらなし。
もう少し時間をかけてなぜ上手くいかないのか調べてみたいと思います。
/usr/includeの下をあれこれ眺めていましたが、Libcは難しいです。
開発者の頭の中にあるUNIXに関する知識に驚くばかりです。
ただし、BSDのそれはもう少しシンプルだったようにも思います。
__GNUC__などのプリプロセッサ用の値はgcc/c-cppbuiltin.cの、
define__GNUC__という関数にてgcc/version.cの値をそのままに設定していました。
3.3まであったno-gccなるオプションは3.4にてなくなったようです。
スレ違いらしいので、これにて終りにさせて頂きます。
半可通なGCC廚が多いな。 答えられないなら黙ってりゃいいのに。一生ビルドだけしてろ。
お前が黙ってろw
799 :
デフォルトの名無しさん :04/06/16 15:45
ソースとアセンブリの混合リスティング出すオプションは無いの?
gcc --help gcc -v --help
発音と日本語での書き方は別物。 warming upをワーミング・アップとかStar Warsをスター・ワーズとか言う奴はアホ。
おとうちゃん! クロスコンパイラビルドしてみたんだけど、ブートストラップのcrti.oを作ってくれないよ! crtbegin.oとかは作ってくれるのに、何故ぇ??
>>803 クロスで、とくにカナディアンで、ライブラリ作るの、
けっこうノウハウいるから苦労するよ。
俺なんて、cc1 とかのコンパイル成功した時点で、それ使っちゃうからな(w
>>805 じゃ、無いってことだろ。あきらめたら。
開発者の人はどうやってデバッグしてるんだろう。 ソースとアセンブラ(もしくは他の内部的な中間コード)の リストあったら見やすくない?
>開発者の人はどうやってデバッグしてるんだろう。 gdbでデバッグしている。といいたいところだけど。 制御系だとターゲットが常に手元にあるわけではないし 問題が発生しても、エンドユーザの環境でデバッグするわけにもいかない。 そこで例外発生時のバックトレース情報 (例外が発生したアドレスと、その呼び出し元のアドレスの一覧) から調査を始めるわけなんだけど ldの吐き出したマップファイルからアドレスと関数の対応はわかるものの ソースのどの行かまではわからないんだよね。 アセンブリリストは -S で出るから、そのリストを見て、おそらくこの行だろう と推測するしかないという状況。 外部ツールでもいいから、ソースとアセンブリの混合リストを吐く方法は無いだろうか? デバッグ情報付きのオブジェクトから作れそうなものだけど。
仕事上、生粋のエイゴリアンともよく話すんだけど 連中にもワーニングって言って通じたよ 「ウォー」より「ウヮー」って発音だったけどね
warm と worm のどっちがワームなのか知らない奴が沢山いる予感・・・
いつまでくだらんネタやってんの?
>>805 objdump にそういう機能がある。
--source
Display source code intermixed with disassembly, if possible.
Implies -d.
>>812 ありがとうございます。
objdumpとは、言われて見ればああなるほど。
これで仕事が進みます。
>>813 >これで仕事が進みます。
それが、2chサーチエンジン。まれに嘘を吹き込まれるが。(藁
hoge と表示してくれるのを期待したのに、piyoが表示されてしまいました。 これってANSI的にはどうなのよ? $ gcc --version gcc (GCC) 3.3.1 (cygming special) Copyright(略) $ cat hoge.c #include <stdio.h> int main(int argc, char **argv) { printf("hoge\n"); return 0; } static void puts(void) { printf("piyo"); } $ gcc -ansi -pedantic -Wall -O -o hoge hoge.c hoge.c:6: warning: `puts' defined but not used $ ./hoge piyo$
あ、スペースが詰まってインデントが見難い…
$gcc --version gcc (GCC) 3.4.0 20040601 (Gentoo Linux 3.4.0-r6, ssp-3.4-2, pie-8.7.6.3) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $gcc -ansi -pedantic -Wall -O hoge.c fo.c:6: error: conflicting types for 'puts' fo.c:6: error: conflicting types for 'puts' fo.c:6: warning: 'puts' defined but not used でした。
あ、ファイル名違ったままだった。スマソ。
_main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax call __alloca call ___main movl $LC0, (%esp) call _puts movl $0, %eax movl %ebp, %esp popl %ebp ret なんでここで_putsが出てくるのかな。漏れも知りたいです。
gccのおせっかい機能だった気がせんでもない
-Oをはずせばprintfになる。 GCCの最適化処理が、不変な文字列出力であった場合、 puts等に置き換えるがその影響かも。 これは、既知の問題なのか? まぁ、通常こんな書き方するやついないが。
>>819 ANSIはしらんが、最新のJIS C(=ISO C)ではライブラリの識別子は予約とされていて、
同じ識別子を使うと未定義となる。C89でも同じだと思う。
だからこの動作でもOK。
JIS X 3010 2003(ISO/IEC 9899: 1999) 126ページ 7.1.3 予約済み識別子
>>819 でなくて
>>816 だった。
しかしJISCのサイトはなんでアイコンがネットスケープなのかな?
>>824 >しかしJISCのサイトはなんでアイコンがネットスケープなのかな?
ワロタ
鯖は、Solarisだがな。
自作putcharを作成したんですけど、以下の警告が出てしまいます。 この問題を回避する方法ってあるのでしょうか? hoge.c:28: warning: conflicting types for built-in function `putchar' gcc version 3.3.3です。
putcharという名前に拘るのをやめる
>>826 1. 自作putcharの名前を変える.
2. built-inのputcharが宣言してあるheaderを読み込まない.
3. c++にして名前空間を利用する.
くらいでしょうか.
普通は1、正しいのは3、2を選ぶ奴はドンキホーテ
>>823 7.1.3 予約済み識別子 だけだと、
ライブラリの extern な識別子は、extern な識別子として使うのは予約済みだけど、
>>816 みたいに、static な識別子として使うのは予約されてない。
けど、6.2.2 識別子の結合 で、
翻訳単位の中で同じ識別子が内部結合と外部結合の両方で現れた場合、その動作は未定義とする
となっているので、動作は未定義になる。
という理解であってる?
>>820 最適化すると、printf("hoge\n"); が puts("hoge"); に置き換えられたり、
printf("%s\n", s); が puts(s); に置き換えられたりするみたい。
(ただし、返却値を使ってない場合)
>>818-8223 printf が最適化で puts に置き換えられるのは、
ちょっと余計なお世話なような気はするけど、通常は問題なさそうなので許すとして、
int puts(const char *);
static void puts(void) {}
が、型が違うぞゴルァと言われずにコンパイルできてしまうのは、ちょっと気持ち悪いかな。
Use either of -fno-builtin-printf or -fno-builtin
834 :
デフォルトの名無しさん :04/06/22 11:04
局所的なstatic変数の動的な初期化をスレッドセーフに行わせるための オプションってありますか?C++です。 void foo(void) { static int bar = baz(); // ここ return ++bar; }
排他制御しろ。
main()に入る前(にstatic storageの変数の初期化が行われる)はシングルスレッド。
>>835 > 排他制御しろ。
チーム全体に周知するのが困難で。
>>836 局所変数だからmainの前には初期化されまへんね。ゼロクリアは保証されてるけど。
static __thread int bar = baz(); とすると、何が変わるの?
とおもったがやっぱり排他制御しますー。
>>839 >とおもったがやっぱり排他制御しますー。
それが一番無難だ。
>>838 > static __thread int bar = baz();
> とすると、何が変わるの?
動的初期化はできないですよん
>>844 >動的初期化はできないですよん
起動時に一度だけ初期化したいってことか?
なら、フラグを持って排他制御だな。
排他制御の徹底をチーム全体に伝えれないのに、スレッドとか使うのは なんだか凄く危険な予感がするんだが。
>>846 人のことなんてしったことではありません
動的初期化って言葉あまり言わないなぁ。
>>848 JISの用語だろうなJISX3014の3.4.2とか見てみれ。
850 :
デフォルトの名無しさん :04/06/22 16:45
VC++で書いたコードをg++でコンパイルしたら ファイルサイズが結構でかくなったんだけど、 これは仕様ですか?
852 :
デフォルトの名無しさん :04/06/22 17:00
>>851 -Osでコンパイルして、stripしたら、70KBくらい減った。
ありがとー
質問しといて「は?」は無いよな・・・
厨房だろ
gccで以下のように宣言できるんですけど いったいどうなるんですか? struct hoge;
g++で以下のように宣言できるんですけど いったいどうなるんですか? class hoge;
これってどういう意味? __attribute__((noderef, hogehoge(1)))
>>858 gccさんが、(´・∀・`) ヘェーって思う。
>>859 g++さんが、(´・∀・`) ヘェーって思う。
>>860 gccのバージョンとターゲットは何?
3.3.2のソースを眺めでみたが、見当たらん。
>>858 ,859
C++だと時々使うよ、Cでも通るんだな struct hoge は初めてだ
後でちゃんとしたの宣言するから、とりあえず通せって考えてるけど
実際どうなんしょ?
相互参照する構造体での前方宣言ですよ。 struct foo; struct bar { struct foo *p; }; struct foo { struct bar *p; };
struct __foo { struct __foo * p; }; というのもある意味前方参照?
>>867 2パス通せばいいと思うんだが。
コンパイル高速化の為?
>>869 それもあるが、実態を隠したいわゆる ADT (抽象データ型) を実装する
ためにも使う。
>>870 >それもあるが、実態を隠したいわゆる ADT (抽象データ型) を実装する
>ためにも使う。
なるほ。
struct foo; こういうのは不完全型という。
class foo; //class header class foo {}; //class body と、C++では言います
>>873 "class header"というと、ほとんどが「クラス定義を含むヘッダファイル」を指して言うみたいなんだが、
その意味で使われている例をWeb上の文書で示せるか?
876 C++Primerに載ってただけ。便利だから俺はよく使ってる。
ごめん今ちゃんと読んだら、class headだったし、 全然違う意味だった。逝って来る。
>>877 たぶん一般的じゃないからやめたほうがいいと思う。
>876のような意味に勘違いされる可能性が高い。
関数の場合を考えると、
void foo(); // 関数宣言
void foo() {} // 関数定義
この使い分けは一般的だから、
class foo; // クラス宣言
class foo {}; // クラス定義
こう使い分けるのがすっきりしてるかも知れない。
ただ、「クラス宣言」が「クラス定義」の意味で使用されることが多いので、
これも誤解を生まないわけではない。
現状で最も誤解が少ないのは、
class foo; // クラスの前方宣言(forward declaration)
class foo {}; // クラス定義
と使い分けることだろう。
lippmanのいうclass head,class bodyとは class CLASS //この部分がclass head { //この部分がclass body ... ということ。汗かいちゃった。
>>879 > この使い分けは一般的だから、
一般的というか、規格書で使ってる用語そのまま。
>>881 ああ、NO DEREFerenceなのか。
・"noderef"を付けるとデータを参照してないポインタに警告を出す。 ・address_space(N)データへのポインタは、同じaddress_spaceへのポインタと型が互換になり、そうでなければ警告を出す。 ってこと? なんだかよくわからんが。
>>884 逆でしょ。
dereferenceしようとすると警告になるんでしょ。
使い方としては「カーネル空間からユーザ空間にアクセスしようとすると警告」など。
ソース見てたら以下の文字列がありました。 #pragma pack(1) #pragma pack() これってなんすか? ネットで調べるとpragmaは古い仕様なことがありましたが。
>>888 さんくすです。paddingか。
__attribute__ ((aligned (1), packed))ってことか。
pragmaってよく使用するんですかね。attributeを使えばいいような気もしますが。
attributeはgccの拡張仕様だから。 文法的にはattributeの方がわかりやすくでいいけど。
DLL作りでメモリ共有する時にもgccではattribute shared使うけど、MSだとpragma使うから コンパイラ非依存にするには#ifdefでごちゃごちゃやってやらないといけないのが面倒。
>>892 該当するページが見つかりませんでした。
検索のヒント
- キーワードに誤字・脱字がないか確かめてください。
- 違うキーワードを使ってみてください。
- より一般的な言葉を使ってみてください。
- キーワードの数を少なくしてみてください。
896 :
デフォルトの名無しさん :04/06/27 18:15
それにしても、3.0 以降はバージョン番号がさくさく進むね。 なんか 2.95.2 のときの停滞がうそのようだ。
>>896 前は人手が足りないようなことを言ってけど、
開発メンバが増えたのかな。
エンタープライズ向けのみになって暇になったRedhat内の開発者がまたいじってるんじゃないかと推測
【gccの最適化オプション一覧】 -fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3 -Os
これって何? コストのかかる最適化?なんか矛盾してるような気がするが。 -fexpensive-optimizations
>>901 コンパイルにコストがかかるってことだろ。
>>904 >コンパイルにコストがかかるってことだろ。
Oh, I see.
>>902 まだ出てない。
>>899 は、GCC 3.5を作成するにあたって行われる変更、新機能、修正一覧を知らせてるだけ。
>>901 -fexpensive-optimizations
Perform a number of minor optimizations that are
relatively expensive.
意訳すると「時間もメモリも喰うワリに効果の薄い最適化を行う」だ。
gcc-2 の頃からあったような希ガス
909 :
デフォルトの名無しさん :04/06/29 20:03
gccではなくg++で、トランポリンのコードが生成されるシチュエーションってありますか? ネストした関数はg++だとコンパイルできません。
>>900 -Oはいっぱいあって、-O999あたりまでいける。意味は皆無だと思うが。
>>910 昔、某ディストロは「-O99」なんてやってたね。今はどうだか知らないけど。
プリコンパイルヘッダをもう少しだけなんとかしてくれんか脳… そういやx86用ならIntelのC++コンパイラはGCC完全互換+ごっつい プリコンパイラヘッダ対応らしいが、GCCとどう違うんだろう。
よく聞きますけど、 「トランポリンコード」って何ですか?
>>914 よく聞く ?
俺は初めて聞くが、どうも Linux 関係らしいから、それ以上調べるのはやめた。
917 :
デフォルトの名無しさん :04/07/03 11:29
>>909 は何のことか分からないけど、
Linuxのトラノポリンはスタック領域の移動に使うコード。
シグナルハンドラで使われる。
二つのトランポリンを横移動ってイメージの命名だと思う。
918 :
デフォルトの名無しさん :04/07/03 12:10
clock()で秒以下の数値が戻ってこないのですが、 なにかオプションの指定が必要なのでしょうか? gcc 3.2.3 20030502(Red Hat Linux 3.2.3-20) を使用しています。
gccの問題なのか?
ははは いいつっこみだ。
>>918 gccとは無関係だからLinux板で。
まぁ、gettimeofday()でも使っとけってことで。
以下のソースで、 int main(){ short a; int b; a = b = -1 printf("%d, %d\n", sizeof(a), sizeof(b)); printf("0x%X\n", a); printf("0x%X\n", b); return(0); } 結果が 2, 4 0xFFFF 0xFFFFFFFF とならずに 2, 4 0xFFFFFFFF 0xFFFFFFFF になりましたけど。なぜでしょうか?
>>923 可変長引数に short 型の変数を渡すときには、暗黙の内に int にキャスト
(格上げ)されるから。
925 :
デフォルトの名無しさん :04/07/07 00:45
3.4.1 age
>>924 うぉーそうだったんですか!
何年もC使ってたけど知らなかった。 _| ̄|○
逝ってくる。
日本人でGCCデベロッパな方っているんでしょうか? 自分もGCCデベロッパに入りたい。けど、技術力がないからだめか。 やはり、コンパイラの勉強しないとだめですか?
Kに弟子入りすれば大丈夫
たまに開発MLに日本人らしき名前で投稿があっても、しょっちゅうスルーされてた。
英語の下手な香具師はコミュニケーションとれないからな。 技術力以前の問題というか。
>英語の下手な香具師はコミュニケーションとれないからな。 >技術力以前の問題というか。 その逆もまた真になる。 できる奴は技術力でそれをカバーできると思うし、 相手もできる奴とわかれば意思の疎通も多少はできるはずだが。
>>932 コーディングだけならね。パッチ送って採用されたとか
そのレベルでしょ。
>>933 それ以上になにかあるのか?
目的は達成されているような気がするが。
それとも相手の家にでも遊びに行くのか?
>>934 どのバージョンでどの機能を入れるか、みたいなプロジェクトの
方針や決定に関われるようなヤシはいないって事でしょ。
もっともそこまでやるなら、それこそRedHatみたいな会社でフル
タイムのhackerとして雇ってもらうとかじゃないと時間的に無理
だろうが。
>>933 それくらいでも、
hogehogeがおかしいので直して見たけど、これどうよ?
てな事をちゃんと説明しないとスルーされるわけですが。
それなりの実績があれば一行説明でもわかってくれるが。
>>934 commit権もらうとか。
938 :
デフォルトの名無しさん :04/07/08 08:01
3.4.1の出来はどうですか?
GCCじゃなくってGDBの話なんだけど、Cygwin、MinGW用のビルドは 常にスレッド対応してないのかな?? クロス開発で不自由で。 5.2.1〜6.1までをぽつぽつと試してみたんだけど、info thread(s)で どれもRMT ERRORとでるか、最初のスレッドの情報が中途半端に 帰ってくるだけで、2つめ以降のスレッドの情報は出てこない。 break置いても止まらないし、あまつさえメインのスレッド止めても それ以外のスレッドは走りっぱなしなのでデバッグにならん。 gdbserverのバージョン変えても駄目だし、--enable-threads付けて ビルドしても駄目だし、どうしたものか。
んーgdbをデバッグするってのはどう?
>>940 CygwinやMinGW等ではなくて素のOSに入れてもなるのならGDBを疑う。
>>942 手元のLinuxで同じコードをでビルドした時にはならなかった…。
info threadが何も返さない、RMT ERRORが出る、
最初のスレッドの情報しか返してよこさない、というのは、
GNUのページ見てると、Win環境に留まらず、時々報告されてる
バグ?ではあるみたい。
GDBのスレッド対応はターゲット次第らしいので、仕方ないっちゃあ
仕方ないけど、思ったよりも気にしてる人少ないのかな。
>>942 手元のLinuxで同じコードをでビルドした時にはならなかった…。
info threadが何も返さない、RMT ERRORが出る、
最初のスレッドの情報しか返してよこさない、というのは、
GNUのページ見てると、Win環境に留まらず、時々報告されてる
バグ?ではあるみたい。
GDBのスレッド対応はターゲット次第らしいので、仕方ないっちゃあ
仕方ないけど、思ったよりも気にしてる人少ないのかな。
945 :
名無しさん@そうだ選挙に行こう :04/07/11 18:33
各アプリケーションの初期設定では、最適化オプション -O2 であることがほとんどですが -O3 にすると問題は多いのでしょうか? 房な私にアドバイスお願いします。
多くない。
多いって言うかどんな問題があるのか知りたい
-O2にすると偶然動くバグとかあるじゃん。 そういう意味で-O3は問題だ。
酸素とオゾンは大違いだしな
>>940 Cygwin で GNU gdb 2003-09-20-cvs (cygwin-special) を使ってますが、
今のところ、マルチスレッドでおかしな現象には出会ったことないですよ。
自分が不自由してるのは、detach が効かないこと。
他のバージョンではどうなんだろう、試したことないけど。
そろそろ128bitCPU用にlong long longが欲しいな。long long long long かもしれないが。
コンパイル時の定数計算のために、long long(uint64_t)が導入されたが、 ILP64の環境の場合にはuint128_tが必要にならないんだろうか。
954 :
デフォルトの名無しさん :04/07/16 23:56
GCCの最適化オプションは数あれど 基本的には -O* を指定しておけば、必要に応じて -fstrength-reduce等のオプションが設定されると考えて良いのでしょうか? 要するに -O3等はオプションの総合オプションのように機能しているのでしょうか? 素人な私にアドバイスをお願いします。
んじゃ適切なアドバイスを。info読め。ちゃんと書いてあるから。
info読むためにはemacsの使い方を(略
957 :
デフォルトの名無しさん :04/07/17 04:15
#include <iostream> すると、 /usr/include/c++/3.4.0/backward/iostream.h が読み込まれてしまうみたいなんだけど、 /usr/include/g++-3/iostream{,.h} を使いたい場合はどうしたらいいでしょう?
>>954 その認識であってる思います.
最近どっかのスレで見掛けたのだけど,
-vと-Qを同時に指定すると, 実際に有効にされたオプションが表示されるようです.
突っ込まれそうなのでもう一言.
>>954 あなたの言う「総合オプションのような機能」以外のなんらかの最適化を
更に-O*が行なうかどうかを私はよく知りません.
それはソースを当たって下さい.
>>961 ???
何か良いこと知ってるんなら教えて下さい.
ソース読む前にinfoでしょ。
gcc hoge.c -lm 等、ライブラリを使用してコンパイルするときに この'-lm'で具体的にどこのライブラリを参照するかはどのように指定するのでしょうか?
-L/home/foo/lib -L/usr/local/lib -L/opt/bar/lib
>>963 それには異存ないんですが,
infoの説明では,
-O*にいくつかの-f*をまとめて指定する「総合オプションのような機能」があることは分かりますが,
-O*が,指定した-f*以外にも何らかの最適化を行なうのか,-f*の指定だけなのかちょっと不明だったもので.
読み落してたら御指摘下さい.
-O2を指定して959に書いた-vと-Qを使うと, 「渡されたオプション」には-O2が表示されるけど, 「有効オプション」には-O2が表示されないところをみると, -O*は「総合オプションのような機能」だけなのかも.
968 :
デフォルトの名無しさん :04/07/17 12:43
$ gcc -O3 -v -Q test.c > o3.txt 2&>1 $ gcc -O2 -v -Q test.c > o2.txt 2&>1 $ diff o2.txt o3.txt 何もでないよ(^^;
2&>1 じゃなくて 2>&1 だったよ(^^; diff を見るに -frename-registers だけ違うように見える。 gcc version 3.3.1 (cygming special)
古い記憶なんだが、そもそもO3が有効なのはx86系だけなんじゃなかったっけ。
バージョンにより違うんじゃないの?
info も嘘っつーか、source に追いついてなかったりするから しょうがなく gcc/toplev.c と md 部分の *.c や *.md 見て確かめてるな。
-finline-functionsはO2にあるはず無いし、O3に無いはずが無いだろう
>>974 manによるとそうなんですけど,
gcc -v -Q -O3 hoge.cpp
だと,-finline-functionsが出ません.
やっぱgccはソースを見るしかないのか.
-v -Qが壊れてるんじゃないの?
gcc -v -Q -O3 -finline-functions hoge.c としても,有効オプションに-finline-functionsは表示されないので, -v -Qは指定された有効なオプション全部を表示しているわけではない みたいです. 失礼致しました.
>>976 壊れてるっていうか,
-v -Qに全部の有効オプションの表示を期待した私が間違ってたってことです.
979 :
デフォルトの名無しさん :04/07/17 19:24
gcc -S -O2とgcc -S -O3でコード比較すれば インライン展開してる事なんてすぐ分かるじゃん。 アセンブラも読めないのに最適化についてなんて語るなよ。
>>979 それはそうなんだろうけど,
最適化はインライン展開以外にもたくさんあるわけだし,
全部の有効オプションを表示する機能はあれば便利なのでは?
正論だ。 ところで次スレは?
>>980 そう思ったら-v -Qのコード直すなりしてパッチ送りなよ。どうしてそうしないの?
>>983 思った瞬間にスレに書き込んだんでしょ。きっと、もうパッチ作って送ってるヨ。
「おまえら次のリリース楽しみにしておけよ!」
と書き込みたいところだけど.
>>983 ,984
そうやってひとを追い込まない.(苦笑)
私はgccのコード把握してないんで,そう簡単に直せないヨ.