ソースの見た目効率を語るスレ

このエントリーをはてなブックマークに追加
594名無しさん
C++ でポインタや参照を表す * や & ってどこにつけてる?

int *hoge;//1
int* hoge;//2

主にこの2パターンだとおもうんだけど。
1行に複数の変数を宣言することを考えると1なんだけど、
hoge は「intのポインタ」という型であることを考えると、
2のほうがすっきりしてる気もする。

ちなみに俺はポインタは1で参照は2。
>>594
Effective C++ がそうなってるね。俺もしばらくはそうやってたけど、
ポインタと参照で記号位置が違うのが気になったんで、全部2の方で
統一してる。1の場合だと、

char *Hoge(const char *moe);

こういうのが気になるんよね。

ちなみに、『1行に複数の変数を宣言』なんてことは、そもそもしない。
変数宣言したときは、ほぼ必ず初期化もいっしょにするしね。
両方2かな
597594:02/07/20 01:31
>>595,596

やっぱ両方2にしたほうがいいのかな。
位置がそろってないとなんとなくやな感じなんだよね。
おかげですっきりしたよ。さんく。
598595:02/07/20 09:37
ただそうすると、次は配列が気になってくるんだよね。
「intのポインタだから」「intの参照だから」で

int hoge =3;
int* moge = &hoge;
int& sage = hoge;

っていう理屈で行くなら、「intの配列だから」で

int[50] hage;

って書きたくなっちゃう。俺だけかね?
599デフォルトの名無しさん:02/07/21 15:24
>>594 - >>598
おい、その int に const つけるときはどうするのかも語ってください。
600595:02/07/21 17:35
>>599
「語れ」っていうんなら、自分はどうするかを先に言えよ。

俺の場合は、

const int age = 5;
const int* hage = &age;
const int& piyo = age;

だな。

int const* puni = NULL;

とする人って、どれぐらいいるんだろ。あんまり見ない気もするけど。
601_:02/07/21 17:49
>>595
はげどう。それができないから素CとかPascalするのが苦痛。
初期化し忘れたり、関数の一部を修正したり消したりする時
関連してるローカル変数が分かりにくかったりするし。

>>598
確かに。でもint[30]とint[50]が別の型になってしまうような・・・
ん?それでいいのかも。。。
602599:02/07/21 18:10
>>600
いままさにごちゃごちゃになってしまってます。
const int * const pint_table[] = { ...
・・・イライラするんだよ、こんなコード書いてるとよ。

> int const* puni = NULL;
このスタイルにすることもやぶさかではなし・・・・。
NULLはつかわねーけどな。
603594:02/07/22 04:19
>>600

int const * puni = NULL;

だと、ぱっと見で

int* const puni = NULL;

のことかと勘違いしてしまいそう。
* が型(この場合int)と位置的に離れてるのも嫌。
604600:02/07/22 07:27
>>603
つまり const 位置の一貫性をあきらめたほうが、
見た目効率がいい、ということですね。

>int const * puni = NULL;
人じゃないけど、 gcc がこのスタイルで出力してくる。
605599:02/07/22 07:42
604は漏れです。ageで騙ってしまいましたスマソ。
>>589
enumで最後のカンマはまずいだろ...
最後のカンマの意味って何?
#ifdef DEBUGとかそういうのですか?
>>606
> enumで最後のカンマはまずいだろ...
C99ならOK

> 最後のカンマの意味って何?
Cの言語仕様のバグ
609595:02/07/22 21:11
>>604
ん? 一貫性をあきらめるって、どのへんで? 具体的な記述キボン。

>>607
とりあえず、行単位のカット&ペーストで入れ替えをしたとき、
『最後の要素だからカンマを削って……』ってことをしなくて
よくなる、という利点があるよ。

>>608
あれ、これバグだったんだ。知らんかったわ。でもC99でOKってことは、
標準の連中が『コレ何気に便利だから採用』って考えたってこと?
610599:02/07/23 00:03
>>609
「 const は常に直前の型にかかる」という一貫性のことです。
最近 int const X = ...; って書くことが増えてます。
「ポインタ以外の型に対しては直前に const を置く」っていうのが多いみたいだけど、
それだとポインタに対して const をつけるのをつい忘れがちになってしまう。
「constは可能な限り左側に書く」という一貫性でいいじゃん
なにそれ
constを左に置くことが出来るのは1例だけだから、
むしろそっちの方が例外じゃん
順序を変えても意味がかわらない部分でconstを一番左に書くと
言いたかったんだけど。
結局のところ行の先頭と*の直後にしかconstを書かないという事になる。
614595:02/07/23 20:58
うーん。俺は「const int」派なんだけど、「int const」の方が、
たしかに一貫性という点では一歩先んじてるねぇ。
ただ問題は、

char const* const hoge = "ほげ";

ってとき、

[char const][* const] hoge = "ほげ";

って意味で書いてるのに、スペースのせいで

char [const*] const hoge = "ほげ";

っぽく見えちゃう、と。それだけが難点。
char const * const hoge="ほげ";
でいいじゃん。
char const って、char unsigned って書くのと同じくらい
気持ち悪いじゃん。
別に。
618595:02/07/25 20:33
>>615
だから、そうすると記述上の一貫性が保てないって事が問題なの。
レス、ちゃんと読んでる?
>>616
そんな書き方ができるなんで初めて知った。
使わないけど。

ほしゅage
 pretty-print一発ですが。
622ド素人:02/09/01 19:13
#define isConst const
char(isConst)*(isConst) a;

はダメ?
脳内で const を isConst と読み替えても良いけど。
623622:02/09/01 19:20
括弧のくくりかた間違えた…
これじゃコンパイル通らねーYO!

…首くくってきます…
>>622
激しくダメ。
" * is const." って意味和漢ネーよ

char const * const a;
では、
" 'a' is a constant pointer to constant char. "
と a から遡ってみればよし。小細工は必要ない。
>>624
Eiffel マンセーとか言ってみるテスト。
ところで "* is const" ってそのまま読めるぢゃねーのさ。
>>622みたく、くっつけると意味不明だけどさ。
constなのは*じゃなくてa。