トリッキーなコード その2

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2006/04/05(水) 21:22:58
>> 945
そのコードはVC6だとコンパイル不可?
こんな↓WARNING&エラーが出てしまいました。

warning C4003: マクロ 'IS_NIL' に指定された実引数の数が少なすぎます。
warning C4003: マクロ 'CAT_I' に指定された実引数の数が少なすぎます。
warning C4003: マクロ 'HEAD' に指定された実引数の数が少なすぎます。
・・・ (略) ・・・
error C2065: 'TYPE_SYM' : 定義されていない識別子です。
error C2146: 構文エラー : ';' が、識別子 'IF_' の前に必要です。
error C2065: 'IF_' : 定義されていない識別子です。
error C2062: 型 'int' は不要です。
953デフォルトの名無しさん:2006/04/05(水) 22:11:43
>>952
ごめん。書き忘れてた。
>>945はgccとBoost.waveで通ることを確認した。
試してないけど、DigitalMarsの最近のバージョンでも通るかも知れない。
それ以外のプリプロセッサだとたぶん通らない。
954デフォルトの名無しさん:2006/04/05(水) 22:18:37
え、カスじゃん
955デフォルトの名無しさん:2006/04/05(水) 22:53:59
趣旨を理解しろよ駄馬。
956デフォルトの名無しさん:2006/04/05(水) 23:23:45
つまりカスだってことでしょう
957デフォルトの名無しさん:2006/04/05(水) 23:38:46
プリプロセッサにコンパイラ依存なんかあるもんなのか・・・
マクロ展開できる深さに制限があるとかならともかく、そもそも展開方法が違うとは。
プリプロセッサなんてC言語のときから変わってないものと思ってた。
958デフォルトの名無しさん:2006/04/06(木) 07:26:09
すごいっちゃすごいけど、あんまり使い道が無いなw
959デフォルトの名無しさん:2006/04/07(金) 23:49:22
これでいいんじゃね?

#define TYPE_MAX(type) (\
strcmp(#type,"char")==0?CHAR_MAX:\
strcmp(#type,"short")==0?SHRT_MAX:\
strcmp(#type,"int")==0?INT_MAX:\
strcmp(#type,"long long")==0?LONG_LONG_MAX:\
strcmp(#type,"unsigned char")==0?UCHAR_MAX:\
strcmp(#type,"unsigned short")==0?USHRT_MAX:\
strcmp(#type,"unsigned int")==0?UINT_MAX:\
strcmp(#type,"unsigned long long")==0?ULONG_LONG_MAX:0)
960デフォルトの名無しさん:2006/04/08(土) 01:27:16
typedefしてたら?
961デフォルトの名無しさん:2006/04/08(土) 02:44:17
即値じゃなきゃ駄目でしょー
962デフォルトの名無しさん:2006/04/08(土) 05:14:44
gccは翻訳時に関数を実行して定数化するオプションがあると聞いたことある。
例えば a = strlen("ABC") を a = 3 にしてしまうとか。
963デフォルトの名無しさん:2006/04/08(土) 05:49:29
プリプロセッサより前に実行される関数はありません。
964デフォルトの名無しさん:2006/04/08(土) 12:46:37
>>963
はぁ?だから何?
965デフォルトの名無しさん:2006/04/09(日) 00:46:20
>>964ハァ?
966デフォルトの名無しさん:2006/04/09(日) 02:27:26
>>965ハァ?
967デフォルトの名無しさん:2006/04/09(日) 02:29:19
デッドロックしてねえで前に進め。
968デフォルトの名無しさん:2006/04/09(日) 12:49:53
>>963
で、それが何?
969デフォルトの名無しさん:2006/04/09(日) 12:56:09
ヒント:即値
970デフォルトの名無しさん:2006/04/09(日) 13:14:48
つまり>>962では即値が取得できないから意味が無いってことだろ。
971デフォルトの名無しさん:2006/04/09(日) 14:47:03
>>970
きみは>>962の前半を読んでいるのか?
972デフォルトの名無しさん:2006/04/10(月) 11:48:20
日本に来て日が浅いんだろう。
973デフォルトの名無しさん:2006/04/11(火) 20:45:14
>>962
>gccは翻訳時に

プリプロセスの時点ではまだ即値になってないんだろ。
974デフォルトの名無しさん:2006/04/12(水) 00:58:45
しかし、コンパイル時にはstrcmp(リテラル, リテラル) になるから
コンパイラがstrcmpの仕様を知っていれば最適化できる、ということかな。
関数を実際に実行するというのは無理だもんね。
975デフォルトの名無しさん:2006/04/12(水) 04:16:00
まあ、俺の下痢便でも飲んで落ち着け。
976デフォルトの名無しさん:2006/04/12(水) 09:35:10
>>973
で、それが何?
977デフォルトの名無しさん:2006/04/12(水) 11:37:05
>>974
事前にコンパイルされている関数なら実際に実行するのは無理ではないだろうね
static/グロバーバルな変数を使わずハードも叩かない関数については
純粋関数としてマークしておいて、
コンパイル時に呼び出して即値入力をさせて結果を出すとかさ

OCXとかDelphiなんかはコンパイル時ではなく設計時にコンパイル済のモジュールを実際に動かしてるよね
978デフォルトの名無しさん:2006/04/12(水) 18:17:57
>>977
gccのドキュメントは読んだのか?
ぐぐったらstrcmpの最適化については書いてあったぞ。
979デフォルトの名無しさん:2006/04/12(水) 18:19:35
gccの実装の話をしていたのか?
980デフォルトの名無しさん:2006/04/12(水) 19:27:32
gccの最適化の話じゃないのか?
話が噛み合ってない理由がわかった希ガス
981デフォルトの名無しさん:2006/04/12(水) 19:35:23
いや、だからコンパイラが関数の仕様をしらなくても
純粋な関数なら入力に対して出力は必ず一意に定まるのだから
純粋な関数に定数の入力があれば、コンパイル時にその関数を実行させて
結果を定数化する事は可能だろうという事。


純粋な関数≒状態を保持しない で
状態を保持しないかどうかはコンパイル時に判るのだから
982デフォルトの名無しさん:2006/04/12(水) 21:59:08
だからおまいら何の話してるのかそれぞれ言ってみろw
983デフォルトの名無しさん:2006/04/12(水) 23:20:31
gccの関数を定数に置き換える変なオプションはトリッキーってことでFA?
984デフォルトの名無しさん:2006/04/13(木) 05:32:43
>>981
外部にあるライブラリ関数だから純粋関数の判定はそう簡単ではない
やるとすればいくつかの関数を決め打ちにするしかなさそうだ
985デフォルトの名無しさん:2006/04/13(木) 19:32:18
しかしライブラリ関数をinlineで実装してはいけないという規定は無いわけで……。
986デフォルトの名無しさん:2006/04/13(木) 19:44:42
ハァ?誰が淫乱関数の話してんだよヴォケが。
987デフォルトの名無しさん:2006/04/13(木) 23:55:31
もうそろそろスレ違いだから他でやんな。
gcc固有の動作ならそういうスレがあんだろが。
988デフォルトの名無しさん:2006/04/17(月) 21:33:34
*
989デフォルトの名無しさん:2006/04/21(金) 05:18:26
*
990デフォルトの名無しさん:2006/04/22(土) 12:05:38
*
991デフォルトの名無しさん:2006/04/22(土) 22:32:27

992デフォルトの名無しさん:2006/04/24(月) 09:58:05
993デフォルトの名無しさん:2006/04/24(月) 18:35:52
994デフォルトの名無しさん:2006/04/24(月) 22:18:05
(゚∀(  *  )
995デフォルトの名無しさん:2006/04/24(月) 22:59:17
あふ
996デフォルトの名無しさん:2006/04/24(月) 23:20:14
埋めますか。
997デフォルトの名無しさん:2006/04/25(火) 00:20:20
まぁネタがねえならな。乙乙。
998デフォルトの名無しさん:2006/04/25(火) 21:35:51
//
999デフォルトの名無しさん:2006/04/25(火) 22:04:46
1000なら、オナヌーする
1000デフォルトの名無しさん:2006/04/25(火) 22:16:14
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。