トップページ⇒prog
265コメント57KB

お前らなんでもかんでもDEFINEすんじゃねぇ

■ このスレッドは過去ログ倉庫に格納されています
0001仕様書無しさんNGNG
仕事でCのソース解析してるとよーすぐ MAX_VALUE とかDEFINEで定義
してあって、その定義みるとまたそこにDEFINEで定義したものがあって…
と、非常に可読性が悪い!

DEFINE房は自宅でフリーソフトでも作って満足しててください。
0002仕様書無しさんNGNG
ズザー

つーか、数字直接うめてるのをあとで全部手で変更すること考えると
非常にウツ。
0003shigeNGNG
#define private public
0004仕様書無しさんNGNG
#define _ main
0005仕様書無しさんNGNG
#define mein main
0006仕様書無しさんNGNG
#define shige 逝ってよし
0007仕様書無しさんNGNG
#define shige shine
0008仕様書無しさんNGNG
#define shige うんこ
00091NGNG
だからなんでもかんでもDEFINEすんじゃねぇっての!
おい、いねーのかよ、オレと同じ意見のヤツ!?
0010仕様書無しさんNGNG
漏れはdefineしないヤツのほうが許せねぇ
0011仕様書無しさんNGNG
define all the people
0012仕様書無しさんNGNG
なんでもかんでも define するな、ってのは同感。
それで?
00131NGNG
いや、だからさ、1階層くらいなら問題ねえよ。
でもよ、2重3重にdefineされてるとさ、もう追いかける気力も失せるわけ。
そんなソース書くんだったら、一生オマエが面倒みろっての。わかる?
0014仕様書無しさんNGNG
書いたやつに言えよ。
00151NGNG
ギャフン
0016仕様書無しさんNGNG
2重に define したら、エラーになるぞなもし?
00171NGNG
いや、私も少し興奮しすぎました。反省します。

じゃなくて、私が聞きたいのはですね。
そうやって幾層にもdefineで定義している人は、
なんでそういうコーディングをするのかを聞きたいんです。
可読性を下げる以上のメリットがあるならば、具体的にどんな
メリットがあるのかを教えて欲しいのです。

もうひとつ、defineされまくったソースを読むコツがあったら
教えてください。よろしくお願いします。
0018仕様書無しさんNGNG
だから書いたやつに聞いてみろって。
00191NGNG
誰が書いたかもわかんねぇんだよゴルァ!!!

0020仕様書無しさんNGNG
>>16
#define AAA 1
#define BBB AAA
00211NGNG
すみません、ついキレてしまいました。
>>20ええ、そんな感じでもっと複雑に定義されまくってるんです。
もう、イヤッ!と思うんですが、仕事ですので仕方ありません。

今回、仕様変更のための改修なのですが、ソースの解読に時間が
かかって本当にはかどりません。
0022仕様書無しさんNGNG
>>1 ってかわいいな。
0023仕様書無しさんNGNG
基本的に、defineの値なんて気にする必要ないだろ?
そのためのdefineなんだから。
0024仕様書無しさんNGNG
gcc -E foo.c | less
0025仕様書無しさんNGNG
>>1
たとえば
サーバ側のアプリである文字列長とdefineするとする。
そのサーバと通信するAPIもそのdefineはつかえるよな。
そのAPIを使うアプリでも文字列長を参照するときに,
サーバ,APIで使用しているヘッダを直接参照できない仕様のときなんかに
そのdefineを呼び出す形で使ったりするわけよ。
設計段階でモジュール化を心掛けているとこういうケースはままある。
なんてマジレス。
俺はこんな認識だけどいいかな?
煽りやツッコミもあればまた俺も勉強できるわけで,歓迎
0026仕様書無しさんNGNG
#define MAGIC 5

何だよ MAGIC って。。。コメントもないし。
こんなのもういやだ。。助けて。
0027仕様書無しさんNGNG
最近、C で整定数を定義する目的には enum を使ってます。
0028仕様書無しさんNGNG
とりあえず検索しれ。
検索すればすぐに分かる。

分からないのはお前が馬鹿かめんどくさがりだからだ。
0029仕様書無しさんNGNG
#define CODE_CONV(val) \
(val == 3? "084" \
:val == 14? "021" \
:val == 36? "029" \
:val == 51? "006" \
:val == 54? "077" \
:val == 68? "019" \
:"999")
0030仕様書無しさんNGNG
>>26
マジック・ナンバーに MAGIC と名前を付けるとは、漢だねぇ。
0031仕様書無しさんNGNG
>>29
こんな書き方あったのか
ちょっと勉強になったな(w
0032仕様書無しさんNGNG
マクロだと簡単な関数みたいに機能するものは作れるんだよね。
プリプロセッサで定義した文字列に置換されるだっけか?たしか。
詳しくはよーわからんが。
0033仕様書無しさんNGNG
C/C++のマクロはソースにぶちまけんだぞ
0034仕様書無しさんNGNG
>>17
> そうやって幾層にもdefineで定義している人は、
> なんでそういうコーディングをするのかを聞きたいんです。

一見きれいなソースに見せかけて、他人には容易に
解読できないようにするためだと思っている。

多層define以外の方法で可読性を落とすと、
他人にはコーディングセンスを疑われてしまうからな。
0035仕様書無しさんNGNG
MFCって多段すぎるね。読んでくとわけわからん。
緻密にマクロが絡み合ってるようだが。
可読性を落としてわからなくさせてるのかな?これも。
0036仕様書無しさんNGNG
>>35
そういうこと。あれも簡単に解読させるわけにはいかんからな。
0037仕様書無しさんNGNG
あとありがちなのが,
自分でdefine切って,何箇所も使った後,
以前のソースに同じdefineが見つかるという罠。
わざわざ全部なおすのは面倒だからな(w
0038仕様書無しさんNGNG
define するくらいなら const 使えとかそういう話じゃないの?
0039仕様書無しさんNGNG
一元管理とconst化は全然向きが違うだろ。
0040仕様書無しさんNGNG
というか、、、

うまいロジックで定数を減らすことができればそれにこしたことはない。

おまえは、それを言うためにスレを立てたんだろう そうだろう? >>1 よ
0041仕様書無しさんNGNG
>>38
なんでdefineよりconstがいいの?
0042仕様書無しさんNGNG
defineもそうだけど、typedefもやたら定義するとやっぱ可読性は落ちるなぁ。
教科書のCしか知らない新人に万単位のソース読ませると、たいていそこで混乱してる。
自分はtagとgrepを駆使するようになってからあまり悩まなくなったけど。
0043仕様書無しさんNGNG
構造体には可読性が低下しやすい罠がある。
004442NGNG
>>43
でもコード書いてる本人は楽なのかな。
理由は忘れたけど、リストの処理なんかCで書くとき、気が付いたらtypedefするように
なってた。データ構造に関するコメントかドキュメントをちゃんと書けば許容範囲と思う。

0045仕様書無しさんNGNG
>>42
実際、typedef struct … だけはやった方がいい。
それ以外では俺は意地でもtypedefは使わん。
0046仕様書無しさんNGNG
#define NUMBER_ONE 1
#define NUMBER_TWO 2
#define NUMBER_THREE 3
0047仕様書無しさんNGNG
>>41
それはEffective C++に書いてるから読んでおいて
0048仕様書無しさんNGNG
>>38
C++ なら勿論そうする所なんだが。
004942NGNG
>>45
自分はstructをtypedefするとき、気が付いたら手が勝手にこう動く:
typedef struct _hoge { /* _は付けない場合もある。 */
/* ... */
} hoge;

新人を相手にしてると、データ構造の説明が雑なコードで、やたらそれやると、
やっぱ混乱を招く。"Expert C Programming"は反対派で、某藤原氏は賛成派。
0050仕様書無しさんNGNG
#define begin {
#define end }
0051仕様書無しさんNGNG
>>49
Cプログラミング専門過程ですか?
Expert C Programmingの方は知らんが。
0052仕様書無しさんNGNG
昔DEFINE駆使してCでBASICみたいなコード書いたな。

005342&51NGNG
>>51
> Cプログラミング専門過程ですか?
そーです。7章あたりかな。
0054仕様書無しさんNGNG
int a = 1;
int b = 2;
int c = 3;
#define a a + b
#define b a + b
#define c b
#define d a + b + c
printf("%d", d);

こんなんでも通すプリコンパイラの仕様がいやだ。
0055仕様書無しさんNGNG
>>54
単純に置換してるだけだからね。
005653&51...NGNG
41&51は間違い。
0057仕様書無しさんNGNG
>>1
多段をやたらに多用しているというなら、
なんでもグローバル変数にする奴と同程度の
話だと思うがどうか。

基本的な話としては、マクロは、できるかぎり
多段にしないのが礼儀だと思っている。
# define道を極めた人なら別かもしれませんが。

まぁ、使いやすくて、資料なりちゃんと
していれば、さほど問題視しなくても良いと思う。
# 理屈よりも何よりも便利なら ALL OK派。

逆に不便ならゴミってことで。
005851NGNG
>>56
実はあなた管理番号とかの単純なミスの方が多いでしょ?
0059仕様書無しさんNGNG
昔のC/C++の仕様で巨大なプロジェクトを多重defineなしで運営するのは無理。
0060仕様書無しさんNGNG
>>59
昔のC/C++は #define のネストを
プリプロセッサは基本的にサポートしないから
エラーになった、と聞いたことがある気がするが
嘘でしょうか?

ちなみに、昔というとどれくらい前の話です?
0061仕様書無しさんNGNG
>>59
とりあえず理由は?
006253&51...NGNG
>>58
うんにゃ。シラフのときは寝坊以外のミスは少ないよ。(w
006351NGNG
>>62
それは失礼しました。



でもよく番号間違えてる気が…
006462NGNG
>>63
でも、コード書くときは、そのテのミスは少ないけど、仕様書を書いた後とか、
表や図の番号と章とかセクションの番号が合致してない、とかのミスは他の人に
比べて多い。なので貴方の指摘は結構正しいです。(w
ちなみに今ビール2リットル逝ってます。っていうかもう寝ます。
0065仕様書無しさんNGNG
定数間で依存関係がある以上、多段defineせざるを得ないと思うが。
0066仕様書無しさんNGNG
abc.h
#define MAX_ABC 10

def.h
#include "abc.h"
#define MAX_DEF MAX_ABC

ghi.h
#include "def.h"
#define MAX_GHI MAX_DEF

hage.c
#include "ghi.h"
for(i=0; i<MAX_GHI; i++)
printf("hage\n");


よくやってます。
MAX_GHIの中身が知りたければ3回grepしてください。
0067仕様書無しさんNGNG
定数オブジェクトをつくっときゃえーだな。
そうすりゃ普通のオブジェクトと同じスキームで管理できる。
0068仕様書無しさんNGNG
だから〜!
整数の定義にはタグ付きの enum を使え、とあれほどクドクドクド…
0069仕様書無しさんNGNG
#define QUESTION (bb)||(!bb)
0070仕様書無しさんNGNG
#define comment //
0071仕様書無しさんNGNG
2〜3行の関数をことごとくdefineしてるのはどう思うよ?
「なにこの大文字の関数」みたいな。
0072仕様書無しさんNGNG
>>71
DSPチップのシミュレータ開発時に、呼び出しコストを抑えるためにやったことはある。
0073 ◆4COMPILE NGNG
c++だったらインライン関数にするところ、
関数本体より呼び出しコストのほうが高くつくときにそうする。
0074仕様書無しさんNGNG
#define VER "1"
#define RIV "02"

printf("Version = %s.%s", VER, RIV);

なんてありがちだべな
0075仕様書無しさんNGNG
>>66
なんでそんないやがらせを…?
0076仕様書無しさんNGNG
>>74
RIV ってのは REV ではないかと濃い知事館…
0077仕様書無しさんNGNG
#defineの有無なんて大した話じゃないじゃん
単にGrepすればいいだけ
そのくらい仕事だろ
0078仕様書無しさんNGNG
defineをまったくしてくれないヤシよりずっと吉
0079 ◆4COMPILE NGNG
>>78
確かに。
0080仕様書無しさんNGNG
>>77
Grepでなんとかなるのは小規模のプロジェクトだけ。
多層defineが多いってことはモジュール間結合度が強いからそうなるんだよ。
むしろ多層defineしなきゃならない設計の方に問題があって見にくいんだ。
0081ネカマPG ◆IPLoveoQ NGNG
定義を見たくなるのは、表現力の弱いネーミングの問題もあるんじゃないかしら?
何のためのシンボル定義なのかわからないわ。
でも多段の定義は(論理的な意味がなければ)
可能なら避けた方がいいのは確かね。

あと、定数はdefineよりenumの方がデバッガでのデバッグ時に嬉しいわ。
0082仕様書無しさんNGNG
構造体とDEFINEマクロとMallocで
Cでオブジェクト指向もどき
0083仕様書無しさんNGNG
>>81
> enumの方がデバッガでのデバッグ時に嬉しいわ。
コンパイル時にも、妙な値の代入を防げて嬉しい。
0084仕様書無しさんNGNG
うむ、シンボルとはシンボルたる強さがなくてはならぬ。

しかしながら、定数の管理の問題は、OOPで解けぬものかのう。
定数管理オブジェクトあたりはまあまあとは思うものの。
0085 ◆4COMPILE NGNG
>定数管理オブジェクトあたりはまあまあとは思うものの。

どんなかんじで作ります?
昔作ろうとして結局きれいにできず挫折したという過去がありまして・・・
0086仕様書無しさんNGNG
結局さ、つくったところでdefine文でやらかしてたことと同じことやってんのよな(ワラ

定数って実装の一部だから、OOPの配慮から確実に漏れる。
OOPは「仕様は仕様 実装は実装」の問わず語りだから、、、 
だから人間の理性と良心でやるしか、ねーんだろうな。
0087仕様書無しさんNGNG
#define begin {
#define end }

これ最強。
0088仕様書無しさんNGNG
grepすれと言ってるヤツは、>>24を理解できていないようだ。
0089仕様書無しさんNGNG
>88
すみません、理解できません。
いや、煽りじゃなくマジで。
よろしければ解説キボンヌ。
0090仕様書無しさんNGNG
作ったバイナリをgrep って言ってるわけじゃないよね?
0091shigeNGNG
>>89
gccの-Eオプションは、コンパイル/アセンブルを行わずプリプロセスのみ行う。
マクロがどのように展開されるかを確認するときとか。
ただ、出力が読みにくいからRubyスクリプトあたりでもう一段フィルタ梭子魚。

Rubysaikyo−!
0092 ◆4COMPILE NGNG
shigeさんが意味のある発言を!?
はじめて見たかもしれない。
0093shigeNGNG
ごまんなさい
うぇついcf67348お
っっっっっっっっっっっっっr
91は無視してください
貴様とオレとは同期のRubyist!
RubyRubyRubyRubyRubyRubyRubyRubyRuby
RubyRubyRubyRubyRubyRubyRubyRubyRuby
RubyRubyRubyRubyRubyRubyRubyRubyRuby
0094仕様書無しさんNGNG
よほど気分が良かったのか、それとも天変地異の前触れ。
0095仕様書無しさんNGNG
shige -> http://pc.2ch.net/test/read.cgi/tech/1022303420/
0096仕様書無しさんNGNG
なるほど。プリプロセッサ出力オプションか < -E

んなもんgccつかってないとわかるわけねーやん
(なんとなくそのあたりだろうとは思ったけど)
0097仕様書無しさんNGNG
>>94
そういえば、昨夜は雷がやたらうるさかったし、大粒の雹も降ってたな。
0098仕様書無しさんNGNG
検索しる >96 ものの1分でハケーンできる
0099帰る場所があるヤシはまだいいNGNG
-E が使えるのはgcc だけではなさそうな気がするのは、きっとぼくがあまちゃんなんだな。
そろそろ帰ろうっと。
0100仕様書無しさんNGNG
お前らなんでもかんでもDEFINTするんじゃねぇ
0101仕様書無しさんNGNG
#define main(argc, argv) WinMain(argc, argv)
0102仕様書無しさんNGNG
0103 ◆4COMPILE NGNG
DEFSTR a-z
0104仕様書無しさんNGNG
オマエラナンデモカンデモでふぁいんスルンジャネェッ!!
0105仕様書無しさんNGNG
Cのソースなんてものは他人に見せるものではないし、他人のを見るものでもない。
仕様貰ってきて一から書き直せ。
0106N88BASICNGNG
>103
全部文字列あつかいかよ! 
0107仕様書無しさんNGNG
const char *msg = ">>1さんに届け!この思い(・∀・)";
0108仕様書無しさんNGNG
defineがいやなら、defineだけ変換するプリプロセッサつくって、
それ通して読んだらいいんじゃないの?
そしたら>>105 に怒られずに済むし。
0109仕様書無しさんNGNG
Javaにマクロが無いのはあまりに不便
0110仕様書無しさんNGNG
>>109
無くて困ったことねーよ。
0111仕様書無しさんNGNG
関東地震キタ━━━━━(゚Д゚)━━━━━!!

#define A Afo
#define B ka
#define Afoka A##B
0112仕様書無しさんNGNG
>>110
やせ我慢はいくないよ。
0113仕様書無しさんNGNG
#ifdef __なんたら__
# ifdef _かんたら
#  if うんたら && こんたら
   DYNLOAD_FUNCTION int uhehehe ARGS((int got, char *it))
#  else
…

こういうのは勘弁してほしいっす。
0114仕様書無しさんNGNG
#define 今のプロジェクト ですマーチ
0115仕様書無しさんNGNG
#undef 今のプロジェクト
0116仕様書無しさんNGNG
KernighanとPikeの「プログラミング作法」には
マクロはできるだけ使うな、定数はenumで、処理は
関数で書けとあるようですが。
0117仕様書無しさんNGNG
文字列定数はdefineするしか。
0118仕様書無しさんNGNG
>>117
const使え
0119仕様書無しさんNGNG
enumってあんな小さい言語仕様の中に入る程の必要性ってあったのか?
あれば使うけど、無くても全然困らない。
0120仕様書無しさんNGNG
extern const char *errmsg = ">>1さんに(省略)ぉ(・∀・)";
0121仕様書無しさんNGNG
ていうか、defineより、constより、関数ポインタを多用するのなんとかしてください。

ソース読んでても、どこの関数が呼ばれてんだか全然分かりません。。。

いや、デバッガで追えばいいだけなんですけどね。。。
0122仕様書無しさんNGNG
>>121
関数ポインタって多用するものなの?

漏れはここ一番でしか使わないけど。

と こ ろ で な ん で 一 行 空 け る の ?
0123仕様書無しさんNGNG
>122
なんかね? イパーイあるヨ? 関数ポインタ?(TдT)
ここ一番がイパーイ?

一行空けたのは何となくデス。深い意味はアリマセン...
0124仕様書無しさんNGNG
あれかな?
Cでポリモフィズムを無理矢理実現しようと…
0125仕様書無しさんNGNG
>>124
それが一番妥当な線かな。
でもポリモフィズムを実現しようとしたなら、
何の関数か気にする必要は無いという罠。
0126仕様書無しさんNGNG
typedef と enum と const があれば #define 使うこともほとんどないんだけど、
 #define offsetof(T, F) ((unsigned long)&(((T *)0)->F))
 #define numberof(V) ((unsigned long)(sizeof(V) / sizeof(*V)))
だけはプリプロセッサでないと…
0127仕様書無しさんNGNG
高専だけど、教官が定数を小文字一字でdefineしてて正直鬱
0128名無しさん@カラアゲうまうまNGNG
#define THE_FIRST_NATURAL_NUMBER 0
#define THE_NUMBER_WHICH_IS_NORMALLY_USED_TO_INCREMENT_VARIABLE 1
#define THE_NUMBER_WHICH_IS_NORMALLY_USED_TO_HALVE_SOMETHING 2
...
0129仕様書無しさんNGNG
>>122
状態遷移やテーブルジャンプするとき便利〜。
0130仕様書無しさんNGNG
何でみんな詳細設計しないんだ?
アホが多いのか?
0131仕様書無しさんNGNG
>130
他人の書いた詳細設計書だけですべて理解できると思うのか?
0132仕様書無しさんNGNG
#define HISAN_NA_1 "悲惨な1が居るスレ"

main()
{
printf("%sですか?\n", HISAN_NA_1);
}

実行結果:
悲惨な1が居るスレですか?
0133仕様書無しさんNGNG
 
0134仕様書無しさんNGNG
VBで書けばよかったんだよ>>1
0135仕様書無しさんNGNG
>>131
だからレビューするんじゃん。
0136仕様書無しさんNGNG
>135
元担当者がすべてを抱え込んだまま逃げたことないんですね。
0137仕様書無しさんNGNG
私はあります。
0138仕様書無しさんNGNG
お前らなんでもかんでもREDEFINEすんじゃねぇ
0139仕様書無しさんNGNG
すいません。。そんな発想は出来ませんでした。
担当者が逃げちゃうようなDQNな会社にいないもので。。
0140仕様書無しさんNGNG
#undef >>138
#define >>138 "(;´Д`)ハァハァ"
0141仕様書無しさんNGNG
defineはいいが、構造体をtypedefするのはやめてくれ。
0142仕様書無しさんNGNG
>>141
むしろ構造体をtypedeしないのが許せない。
0143仕様書無しさんNGNG
>>142
何故!?
0144仕様書無しさんNGNG
多重は確かにやめてほしいな。
某コンパイラのヘッダーファイルとか。
0145仕様書無しさんNGNG
>141
何故?
0146仕様書無しさんNGNG
>>142 に禿げしく賛同。
0147仕様書無しさんNGNG
構造体をtypedefするのってstructを書くのが面倒だから?
0148仕様書無しさんNGNG
なんでtypedefするのかをそもそも理解していないというのは
痛すぎるよ・・・
0149仕様書無しさんNGNG
>>148
unsigned intをuintとかにするのはわかる。
でも構造体にはタグ名ってものがあるだろ?
0150仕様書無しさんNGNG
>149
で、構造体をtypedefしたら何か不都合あるの?
0151仕様書無しさんNGNG
>>150
structがあった方が構造体だとすぐに分かって良い。
0152仕様書無しさんNGNG

タグ名?あんなものは飾りですよ、偉い人にはそれがわからんのです
0153仕様書無しさんNGNG
>151
構造体だとすぐに分る必要ってのがないような気がするが。
弄るときにはメンバ指定するので構造体だとわかるし。
0154仕様書無しさんNGNG
共用体かもしれないじゃないか。と無理言ってみる。
0155仕様書無しさんNGNG
>>151
>構造体だとすぐに分かって良い

なんで?構造体になんかウラミでもあるのか?
0156仕様書無しさんNGNG
構造体とか、共用体とかいちいち気にしなくちゃいけないってのもどうかと思うが。
0157仕様書無しさんNGNG
普通はtypedefするんだ・・・
標準ライブラリではしているものもあればしていないものもあるけど、どうやってするかどうか決めたんだろ。
0158157NGNG
FILEなんかは直接メンバーにアクセスしたりしないからtypedefするんだろうけど、div_tはメンバーにアクセスするよなー
0159あぼーんNGNG
あぼーん
0160仕様書無しさんNGNG
>158
そういうのを“利用者側が”意識してstructつけたりつけなかったり判断する必要があるのは嫌なので、
全部typedefするようにしてる。
0161仕様書無しさんNGNG
構造体の typedef はあっても無くても構わないが。
配列を typedef するのはやめてほしい。

こんなの
typedef int hoge[ 10 ] ;

int * func( hoge a )
{
  ...
  return a ;
}

とか

int ( func( hoge a ) )[ 10 ]
{
  ...
  return a ;
}

とか

しかも基幹になっているライブラリ
たすけて〜
0162くらすちゃんNGNG
構造体?偉そうな名前だな。
やつも所詮コンストラクタで構築されデストラクタで破壊されるのさ。
0163仕様書無しさんNGNG
>>132はちゃんと#includeして、(int)0で返してくれ。

>>161
typedef int hoge[10]
を他の言い方で言うのって難しくない?
そのうちhoge構造体を作るとヨシ。
コンパイラと相談しながら作ってる奴は時々こう言うコード書く。
たぶん、最初は
int hoge[10];
って宣言してたんじゃないかなぁ。
0164仕様書無しさんNGNG
おれ新卒のとき、#define A _MAX_PATHとかやってた。
新人教育の際には、反面教師として、自分のソースを見せて悪いとこを教えている。
転んでもタダではおきん!
0165名無しさん@カラアゲうまうまNGNG
typedef struct _hoge {
...;
} hoge;

とかやってる私はdqnすか??
0166仕様書無しさんNGNG
>165
それ、海外のフリーソフトとかによくあるね。
0167仕様書無しさんNGNG
>>164
ちょっとできる新人にクソミソに言われて鬱になったりしませんか?
オレにはそんな度胸がない・・・
0168仕様書無しさんNGNG
今書いてるソース手本にしてたらクソミソ言われたっていうなら
鬱にもなろうってもんでしょうけど、昔のだったら大丈夫じゃない?

若気の至りってことで。違うか。
0169164NGNG
>>167
クソミソに言えるならコーディングについてちょっとは考えてる証拠。
つか、悪いとこを言葉で言ってもわからないから、悪い手本を見せるのもいいじゃん。
現在は、違うんだし
0170仕様書無しNGNG
定数をDEFINEするくらいなら問題ないけど、
関数で作った方がいいものまでDEFINEで定義するのだけはやめようよ。
ソース追うのに疲れたよ。
0171仕様書無しさんNGNG
>>165
何の意味があるの?まじで
0172165NGNG
リンクリストなどで使う。

typedef struct _hoge {
struct _hoge* next;
...;
} hoge;
0173仕様書無しさんNGNG
>>165
windef.hって、そういうのばかりだと思うけど・・・
オレ、何か勘違いしている?
0174仕様書無しさんNGNG
いろいろ定義されていると読みにくいって文句いう奴は、
タグジャンプも出来ない糞エディタ使ってんだろうな。。。
0175仕様書無しさんNGNG
ていうか、定義の内容を気にするほうが間違ってる。
0176仕様書無しさんNGNG
ところで、defineってマクロだよな?
こないだ某携帯開発メーカーで「マクロについてのコーディング規定は立てないのですか?」と
聞いたら「マクロって何?」と言われた。
色々あるけど、とりあえずdefineの記述がこれまでむちゃくちゃだったので、defineについて指摘したら
 「デファイン?マクロの話をしているんじゃないのですか。デファインはみんな知っているのでマクロについて説明してください」
と言われた。

C言語経験8年とか10年とかの人いっぱいいて・・・一瞬俺が間違っているのかと思ったYO!
0177仕様書無しさんNGNG
>>164
アホというよりアフォですね。
0178(  _。。)_ バタ。 ◆lUd9keO2 NGNG
>>176
疑いようも無くマクロだ。
0179 ◆4COMPILE NGNG
マクロですね、
ただ#define ディレクティブはC言語用語ですけど、
マクロっていうともっと意味が深いし広いですが、

とりあえず176さんは間違ってないと私は思います。
0180仕様書無しさんNGNG
マクロは便利だが、使い方を誤るとバグの温床にもなる。諸刃の剣。
素人にはお勧めできない。
0181仕様書無しさんNGNG
とりあえず◆4COMPILEさんは誘ってると私は思います。

//ユ-ワク(・∀・)イイ!
0182 ◆4COMPILE NGNG
煤i・∀・)!!
0183仕様書無しさんNGNG
>>172
単に
typedef struct hoge {
hoge* next;
...;
};

ではダメなん?
0184172NGNG
それってコンパイルできる??
0185仕様書無しさんNGNG
インライン展開ができない処理系では、define マクロは、必須と思われる。
0186仕様書無しさんNGNG
>>183
お前、それコンパイル通らねえだろうが。初心者か?
0187仕様書無しさんNGNG
これからはhogeではなくhageまたはageを使うこと。
0188仕様書無しさんNGNG
>>185
インライン展開が必須な仕事も今では珍しいという罠。
0189仕様書無しさんNGNG
無理な仕事を要求するバカな上司対策として、defineを使いまくり読めなくして
口出しをできなくする。
0190仕様書無しさんNGNG
>>189
なぜdefineを使いまくると他人が読めなくなるか謎だが、
それは自分の首を絞めることにもなるのでは?
0191183NGNG
struct hoge {
hoge *next;
...;
};
すまんこっちで。
0192仕様書無しさんNGNG
それだと hoge foo; 等と書けない。
(書ける処理系もあるらしいけど)
0193仕様書無しさんNGNG
>>191
C++ならそれでもokかもしらんが、Cだとコンパイルエラーになるんじゃないの。
0194183NGNG
>>192-193
文法を確認したところおっしゃるとおりでした。
0195仕様書無しさんNGNG
今日、機会があってVBのソースを読んだ。
読みやすい。たまたま読みやすいソースだったのかもしれんが、
何をやっているのかが簡単にわかる。

やはりdefineのし過ぎはソースが読みにくくなる原因だなと、再認識した。
所詮defineしまくりは自己満足。
0196仕様書無しさんNGNG
やっぱdefineでシコシコ書いて見にくくするより
グローバルconstな定数だろ
0197仕様書無しさんNGNG
#define 1 2
#define 4 3
0198仕様書無しさんNGNG
>>196
コンパイル時のフラグなども忘れてもらっちゃ、困るな。
0199仕様書無しさんNGNG
#define NULL 1
0200仕様書無しさんNGNG
わ、罠が…。
0201仕様書無しさんNGNG
いくら文字列定数だからって、SQLとかsprintf用のフォーマット文字列をdefineするなよ。。。
0202仕様書無しさんNGNG
>>201
ええ!いいとおもうけどなぁ。同じフォーマットあちこちで使うときなんか。
0203仕様書無しさんNGNG
>>201
別に構わないと思うんだけどねぇ。
0204仕様書無しさんNGNG
>>202
可読性が落ちるだけ。最高にセンスが悪いと思う。
0205仕様書無しさんNGNG
ちゅうかお前ら可読性可読性って言うけどよ、
実際どこまでだったら可読性の面からOKでどこからがNGなわけよ、
そこらへんを駆け出しペーペーの私に教えていただけませんか。

ちなみに自分は>>201はOKだと思います。
0206仕様書無しさんNGNG
>>201
これはありでしょう。
でもまぁ、利便性を考えたらメッセージカタログとかリソース使うけど。
0207201NGNG
sprintf(sql, SELECT_FMT, hoge, hage...);
とかやられてるんだが、SQLによる操作が不安定って言われた時に、
defineされてるフォーマット(ヘッダに書かれてる)と、SQL生成してる
部分のコード両方参照しないといけなくて面倒じゃないか?
0208仕様書無しさんNGNG
>>207
開発環境はなんですか?

0209仕様書無しさんNGNG
>>207
デバッガでsqlの中身を見ればいいだけ

sql文があちこちのコードにあるとカラム名やテーブル名が変更されたとき
あちこち修正しなければならなくなり、その方が面倒。
0210デフォルトの名無しさんNGNG
BSDのカーネルなんて見てもたいしてネストしてないよ。
問題はネストした方が「それっぽい」とか勘違いしてる
房の存在だべ。
必然性のないものを持ち込まれたときの被害は、Cや
C++においてはかなり大きいと思われます。
0211仕様書無しさんNGNG
>>205
> ちゅうかお前ら可読性可読性って言うけどよ、
> 実際どこまでだったら可読性の面からOKでどこからがNGなわけよ、
3年後に自分の書いたソースを読んで何をやっているか理解できたらOK
理解できなかったらNG

# 他人に読ませてみてもOK
0212仕様書無しさんNGNG
>>207
>sprintf(sql, SELECT_FMT, hoge, hage...);
おれはSQLハードコードされてる方がよほど鬱だぞ。もちろん SELECT_FMTなんちゅう
名前でないことが前提だが。ま、むしろviewちゃんと作れよ、ってのが先だな。
0213仕様書無しさんNGNG
文字列リテラルを#defineするなんて、信じられんよ。素人か?

>>209
そりゃそのプログラムがダサいだけ。そんなクソコードの話を
されてもね。
0214仕様書無しさんNGNG
文字列リテラルを #define するんだったら、時間を表す定義でも
#define TIME_sdsd_dd_ddd "%s, %d %s %d %d/%d %02d:%02d:%02d"
くらいの定義をしておかないと、わけわかんなくなるぞ。
0215素人NGNG
>>213
どうやったら素人から脱却できるか教えてください。
0216仕様書無しさんNGNG
>>214
> #define TIME_sdsd_dd_ddd "%s, %d %s %d %d/%d %02d:%02d:%02d"
プッ、君は名前の付け方が下手だね。だから一々定義を見る羽目になる。
0217仕様書無しさんNGNG
defineせずにconstにせ、つのもこの場合おんなじだわな。
命名規約なんつー話もまじって鬱。
0218仕様書無しさんNGNG
>>216
だったらどんな名前の付け方すんだゴルァ
0219仕様書無しさんNGNG
>>218
例えば02/07/17 21:09と出力したい場合
#define TIME_YYMMDD_hhmmss "%02d/%02d/%02d %02d:%02d"
とか。

でも、素人ならともかく普通のC使いは日付フォーマットは
sprintf()ではなくstrftime()を使う。
0220仕様書無しさんNGNG
for(i=0;i<MAX;i++){//4回回る
...;
}

こんなコードがあった。なんのためのマクロだ。
0221まちがってますNGNG
#define PI 3.1416926585897932334626433822795029
0222 ◆4COMPILE NGNG
#define PI acos(-1)

// オマエはいちいちアークコサインからでないとπがだせんのかと子一時間...
0223仕様書無しさんNGNG
#define PI 3
これ最強。
0224デフォルトの名無しさんNGNG
ところで今まで見てきた中で一番奇麗だと
思ったソースはなんですか?
0225仕様書無しさんNGNG
#include "special.h"

int main( int argc, char *argv[] ){
   main2( argc, argv );
}

// 当然 "special.h" 内は地獄..
0226仕様書無しさんNGNG
main(){}
0227仕様書無しさんNGNG
>>213
ワラタヨ。

リテラルな文字列をdefineすること自体信じられないというのは、素人以下だと思われ。
0228仕様書無しさんNGNG
話の流れが追えていない、悲惨な227がいるスレッドはここですか?
0229仕様書無しさんNGNG
#define STMT(stmt) do { stmt ; } while(0)
コレをなんの為に使うかがわからない奴は氏ね
0230仕様書無しさんNGNG
何に使うのん?
0231仕様書無しさんNGNG
>>230
氏ね。
0232230NGNG
(;´Д`)
0233名無しさん@XEmacsNGNG
/* Mask bits sent to the driver Clear() function */
#define DD_FRONT_LEFT_BIT FRONT_LEFT_BIT /* 1 */
#define DD_FRONT_RIGHT_BIT FRONT_RIGHT_BIT /* 2 */
#define DD_BACK_LEFT_BIT BACK_LEFT_BIT /* 4 */
#define DD_BACK_RIGHT_BIT BACK_RIGHT_BIT /* 8 */
#define DD_DEPTH_BIT GL_DEPTH_BUFFER_BIT /* 0x00000100 */
#define DD_STENCIL_BIT GL_STENCIL_BUFFER_BIT /* 0x00000400 */
#define DD_ACCUM_BIT GL_ACCUM_BUFFER_BIT /* 0x00000200 */

XFree86 4.1.0 ソースより
0234仕様書無しさんNGNG
>>229
何の為に??
0235仕様書無しさんNGNG
#define 俺 グレート!
0236名無しさん@XEmacsNGNG
有名だが
1985年の Obfuscated

#define p struct c
#define q struct b
#define h a->a
#define i a->b
#define e i->c
#define o a=(*b->a)(b->b,b->c)
#define s return a;}q*
#define n (d,b)p*b;{q*a;p*c;
#define z(t)(t*)malloc(sizeof(t))
q{int a;p{q*(*a)();int b;p*c;}*b;};q*u n a=z(q);h=d;i=z(p);i->a=u;i->b=d+1;s
v n c=b;do o,b=i;while(!(h%d));i=c;i->a=v;i->b=d;e=b;s
w n o;c=i;i=b;i->a=w;e=z(p);e->a=v;e->b=h;e->c=c;s
t n for(;;)o,main(-h),b=i;}main(b){p*a;if(b>0)a=z(p),h=w,a->c=z(p),a->c->a=u,
a->c->b=2,t(0,a);putchar(b?main(b/2),-b%2+'0':10);}
0237仕様書無しさんNGNG
>>224

 switch (type) {
  do {
   case 0: nx = Hoge1(); break;
   case 1: nx = Hoge2(); break;
   case 2: nx = Hoge3(); break;
  } while (0);
  case 3: nx = -1; break;
  default: nx = type - 2;
 }

目を覆わんばかりに奇麗だ。
0238仕様書無しさんNGNG
それで、
do{
..........
}while(0);
って、なんの意味があるの?
0239仕様書無しさんNGNG
ありゃ?これじゃ do 〜 while の意味がない…

 switch (type) {
  do {
   case 0: nx = Hoge1(); break;
   case 1: nx = Hoge2(); break;
   case 2: nx = Hoge3(); break;
  } while (0);
   Nyo(nx); break;
  case 3:
   Nyo(-1); break;
  default:
   Nyo(type - 2);
 }
0240仕様書無しさんNGNG
にょ
0241仕様書無しさんNGNG
#define HAXAHAXA (;´Д`)
cout<<dejico(HAXAHAXA)<<" "<<usada(HAXAHAXA)<<endl;
0242仕様書無しさんNGNG
>>241
その
dejico()とusada()を実装するの、めんどくさくねぇか?
0243230NGNG
で、>237あるいは>239のコードって、本当に綺麗だと思う?
0244仕様書無しさんNGNG
do{..}while(0)
って、
{...}
でもいいような気がするのだけど。
最後にセミコロンをつけられるのが嫌なんかな?
0245仕様書無しさんNGNG
>>236
define以降は、出鱈目にキーボード叩いたんですよね?
0246仕様書無しさんNGNG
>>244
237 のコードの良し悪しはともかく、あれの do { } while を
ただの { } にしたら結果が変わっちまうだろう。
0247仕様書無しさんNGNG
Nyoがイマイチ。
piyoじゃないの?
0248仕様書無しさんNGNG
switchの中にcaseより先に
他の物を持ってくる、という発想が気持ち悪い…。
つーか、変数の型きぼん。

bool flag=true;
int nx;
int Hoge1(int i);
int Nyo(int i);

if(flag){ 
 switch (type) {
   case 0: nx = Hoge1(); break;
   case 1: nx = Hoge2(); break;
   case 2: nx = Hoge3(); break;
   case 3: Nyo(-1); break;
   default: Nyo(type - 2);break;
 }
flag=false;
}
else{
switch (type){
case 3: Nyo(-1); break;
   default: Nyo(type - 2); break;
}
}
と結果一緒?
Nyo(nx); break;
がいつ実行されるのかがわからんのですが。
Nyoの中身が特別なのかな。
0249仕様書無しさんNGNG
static bool flag=true;
int type;
int Hoge1(int i);
void Nyo(int i);



if(flag){ 
switch (type) {
  case 0: Nyo(Hoge1()); break;
  case 1: Nyo(Hoge2()); break;
  case 2: Nyo(Hoge3()); break;
case 3: Nyo(-1); break;
  default: Nyo(type - 2);break;
}
flag=false;
}
else{
switch (type){
case 3: Nyo(-1); break;
default: Nyo(type - 2); break;
}
}

こうか。
0250仕様書無しさんNGNG
>>248-249
なにがしたいのか良くわからないコードだな。
elseの中、通らないし。
こうしてバグが生成されていくんだね…。
0251仕様書無しさんNGNG
>elseの中、通らないし。
ん?
何がしたいのかよくわからないのは同意するが。
0252仕様書無しさんNGNG
ん。確かにifより前にflagの値が変わっていればelseも通るか。
なにも書いてない=処理がないのかと思ったが。省略してたのかな。

それにしても、
「読みづらかったので、わかりやすく書き換えました」とか言われて
こんなの書かれてたら泣きたくなるよ…。
0253仕様書無しさんNGNG
いや、flag=false;ってのがelseの直前にあるでしょ。
一回if文を読むと残りはelseってしたかったんだけど。
0254仕様書無しさんNGNG
>>253
勝手に補足。
flagはstaticだから一度この関数を通るとflagはfalseのままになるよね、ってこと。

こーゆーのって二つの関数に分けて呼び出し側で呼び分けるのが普通だよね。
0255仕様書無しさんNGNG
http://pc3.2ch.net/test/read.cgi/tech/1027353004/52-54
0256 ◆4COMPILE NGNG
100げと
0257仕様書無しさんNGNG
>>255
ワラタ
0258仕様書無しさんNGNG
おまいらなんでもかんでも外注すんじゃねぇ



だからって、なんでもかんでもオレにおしつけるんじゃねぇ
0259仕様書無しさんNGNG
すまん・・・・
正直なんで構造体をtypedefする必要があるかログをみた限りでは分からんかった。
typedefしたほうが良いのか悪いのかの結論もよくわからん・・・
痛い奴と言われるのは覚悟の上だ。教えてくれ。

ttp://www.google.com/search?num=50&lr=lang_ja&q=typedef%20理由
これの二番目のサイトみたがK&Rに何か書いてあるのか?
0260仕様書無しさんNGNG
260?
0261仕様書無しさんNGNG
エラー制御でくらいgotoを許してくれよー
後藤泣いちゃうよー
0262仕様書無しさんNGNG
>46
こういうの↓も多いね。

#define blank " "
#define blank2 " "
#define blank3 " "

で
  if (strcmp(buf,blank2)==0) {
とかやってる。

Cプルグラマならisblankstr()みたいのを作れと言いたい。
きいとるかねみかかの諸君。

ところでもっとすごいヤシないの?
0263仕様書無しさんNGNG
キミにはプログラムは向かないよ>>1
0264仕様書無しさんNGNG
ふつーこうじゃないか?
変数typeはintじゃないかもしれんけど。


int get_nx(int type) {
 int nx;

 switch (type) {
  case 0: nx = Hoge1(); break;
  case 1: nx = Hoge2(); break;
  case 2: nx = Hoge3(); break;
  case 3: nx = -1; break;
  default: nx = type - 2; break;
 }

 return nx;
}

で上ではこう。
 Nyo(get_nx(type));
0265264NGNG
あ、-1とか-2はdefineしてね。
■ このスレッドは過去ログ倉庫に格納されています