2010-12-12 3 views
13

C++クレイジーtypedef:標準によってこの構文を許可するポイントは何ですか?古い馴染み1

typedef int cute_int; //cute : common and familiar syntax. 

この構文は完璧です。問題ない。

int typedef crazy_int; //crazy : uncommon and unfamiliar syntax. 

だけのプログラマを混乱させるために:

今、私たちは上記のような型定義を書くことができたときに、この構文を可能にする点は何ですか?この構文はどこにでも必要ですか(実際に前のものがあった場合)?コンパイラの観点からどう思いますか?彼らはそれがかわいいか狂っているのですか?あるいは、コンパイラにとってまったく問題ではありませんか?ところで


、このコードはここから来た: 場合Use of typename keyword with typedef and new

あなたはそれが構文エラーがある場合、その後、ideoneでthe working code hereをチェックアウト迷っている場合。

+4

C++/Cはプログラマーを混乱させるように設計されています。あなたが書くことができる表現の複雑さを最大限にすることは明確な設計目標でした。逆に、さまざまな方法で複雑なコードを書くことができます。 –

+4

@James表現の複雑さを最大限にする言語を見たい場合は、perlを学ぶ必要があります。 – SoapBox

+1

私は正直なところ、コンパイラがかわいいかクレイジーな概念を持っているとは思っていません。そこにはGIGOの世界があります。 – BoltClock

答えて

10
+3

だから基本的にこの狂気はCから来る! – Nawaz

+0

ところで、たとえそれがCから来ても、複数のシンタックスをあまり狂わせることはありません! – Nawaz

0

私はこれがstandartによって許可されているとは確信していません。しかし、われわれが知っているように、C++には、許されているが慣習的な構文を持つものがたくさんある。たとえば、この種のもの1[a], "hello"[2];// ...

+2

この行に沿って考えると少し説明があります:a [1] => *(a + 1)=> *(1 + a)=> 1 [a]。 – Nawaz

+1

これはアセンブラのアドレッシングと非常によく似ていますので、あまり理にかなっていません。 –

1

私のg ++​​はそれを受け入れるようですが、コンパイラの観点からは、構文解析が難しくなります:intトークンが発生すると、あなたがtypedefを考慮すれば、それはA typedef Bを持つようになりますのみ意味がある...

を使用すると、型定義を解析している場合は、」tは知っている(とtypedefが起こるしようとしている)か、変数/関数定義を解析していますバイナリ演算子(型の割り当ての意味ではA = Bのように)です。

+3

'typedef'は' const'と同じセットになっているようです( 'const int a'と' int const a'と書くことができます)。 –

+2

@Pawel:このセットは "decl-specifier"と呼ばれます。 – ybungalobill

+1

文法が明白である限り、それは本当に "難しく"解析されません。 – casablanca

10

質問 "?それはあなたが混乱する理由" であります

構文はC++の宣言指定子の文法に由来します。これは非常に一般的であり、C++の多くのもので使用されます。宣言指定子の順序は関係ありません。これらを見て:あなたは十分な長さあなたは構文が実際に均一かつ論理的であることを見つけることができ、それらを見れば

virtual int f() const; 
virtual int* g(int); 
int ptr1; 
int *ptr2; 
typedef const int* name1; 
typedef const int name2; 

int virtual f() const, *g(int); 
int ptr1, *ptr2; 
int typedef const *name1, name2; 

これらは同等です。また、C++の文法を読むことが役に立ちます。

+2

@ybungalobill:この文章は、異なる構文が関係していることを知っている限り良いです。問題は同じです:同じ構文を達成するために異なる構文を許可するのはなぜですか?実際の問題は、どの構文が「本当に」違っていて本当に異なるのか、どの構文が違うのかについては全く同じことをプログラマに混乱させることです。プログラマは、2つの異なることだけを行う6つの構文を覚えておく必要があります。 – Nawaz

+3

@Nawaz:問題は、これらの2つの形式を異なる構文と見なすことですが、実際は同じです。だから私は、あなたが最初の 'inline'、' const'、 'friend''または' int''の順番を覚える必要はないと主張することができます。 – ybungalobill

+0

@ybungalobill:私のコメントを理解するのが難しい場合は、 "syntaxes"という言葉を "forms"に置き換えてください。つまり、同じことをする複数のフォームがある限り、構文は混乱します。別のものを行うフォームのセットがあるからです。 1つのことをする100のフォームと、もう1つのことをする100のフォームがあると想像してください。これらのフォームは不必要に困難です! – Nawaz

関連する問題