2010-12-12 4 views
13

старый знакомый:C++ crazy typedef: в чем смысл разрешить этот синтаксис стандартом?

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

В случае, если вам интересно, если это ошибка синтаксиса, а затем проверить the working code here на ideone.

+4

C++/C были в значительной степени предназначены для смущения программистов. Это была четкая цель дизайна, чтобы максимально усложнить выражения, которые вы можете написать, - вы можете написать невероятно сложный код множеством разных способов - недостатком является то, что вы можете писать невероятно сложный код множеством разных способов. –

+4

@James, если вы хотите увидеть язык, который максимизирует сложность выражений, вы должны изучить perl. – SoapBox

+1

Я честно не думаю, что у компиляторов есть понятие мило или сумасшедший ... это мир GIGO. – BoltClock

ответ

10
+3

Так что в основном это сумасшествие происходит от C! – Nawaz

+0

Кстати, даже если он исходит из C, он не делает несколько синтаксисов менее сумасшедшим! – Nawaz

0

Я не уверен, что это разрешено стандартом. Но, как мы знаем, в C++ есть много вещей, которые допускают, но имеют илогический синтаксис. Например, этот вид вещей 1[a], "hello"[2];// ...

+2

, который мог бы немного объяснить, если вы думаете по этой линии: a [1] => * (a + 1) => * (1 + a) => 1 [а]. – Nawaz

+1

Это очень похоже на ассемблерную адресацию, поэтому не так нелогично. –

1

Я не знал об этом синтаксисе, хотя мой г ++, кажется, принять его ... но с точки зрения компилятора, это делает разбор вещи труднее: когда вы сталкиваетесь с int маркером, вы дон «т знать, если вы разбираете определение типа (и typedef должно произойти) или вы разбираете определение переменной/функции ...

единственный смысл это иметь A typedef B, если вы считаете typedef быть бинарным оператором (в смысле присвоения типа A = B).

+3

Кажется, что 'typedef' совпадает с словом' const' (вы можете написать 'const int a' и' int const a'). –

+2

@Pawel: этот набор называется: «decl-specifier» – ybungalobill

+1

На самом деле это не сделало бы синтаксический разбор «сложнее», если грамматика недвусмысленная. – casablanca

10

Возникает вопрос "? Почему это вас смущает"

Синтаксис исходит из грамматики спецификаторов деклараций в C++, который является очень общим и используется для многих вещей на C++. Порядок спецификаторов декларации не имеет значения. Посмотрите на них:

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

Это эквивалентно:

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

Если вы посмотрите на них достаточно долго, вы можете обнаружить, что синтаксис является фактически однородным и логичным. Также может помочь чтение грамматики C++.

+2

@ybungalobill: Это сообщение хорошее, насколько известно различный синтаксис. но вопрос остается тем же: зачем допускать разные синтаксисы для достижения того же самого? Реальная проблема заключается в том, что она путает программистов о том, какой синтаксис «действительно» различен и действительно отличается от другого, и какой синтаксис отличается, но делает то же самое. Программистам нужно помнить, скажем, 6 синтаксисов, которые делают ТОЛЬКО две разные вещи! – Nawaz

+3

@Nawaz: Проблема в том, что вы рассматриваете эти две формы как разные синтаксисы, но они на самом деле одинаковы. Поэтому я могу утверждать, что таким образом вам не нужно запоминать порядок того, что приходит первым «inline», 'const',' friend' или 'int'. – ybungalobill

+0

@ybungalobill: если вам трудно понять мой комментарий, замените термин «синтаксис» на «формы». Я имею в виду, что, если существует несколько форм, которые делают то же самое, синтаксис запутан, потому что есть другой набор форм, которые делают другое. Только представьте, у вас есть 100 форм, которые делают одно, а еще 100 форм, которые делают другое. Эти формы излишне сложны! – Nawaz

Смежные вопросы