С++ сумасшедший typedef: какой смысл разрешать этот синтаксис стандартом?

Старый знакомый:

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

Этот синтаксис идеален. Без проблем.

Теперь, когда мы можем писать определения типов, как указано выше, какой смысл разрешать этот синтаксис:

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

Просто чтобы запутать программистов? Нужен ли этот синтаксис вообще где-нибудь (когда на самом деле у нас есть предыдущий)? Что вы думаете с точки зрения составителей? Они находят это милым или сумасшедшим? Или компиляторам это вообще безразлично?


Кстати, этот код взят отсюда: ключевое слово typename с typedef и new

Если вам интересно, является ли это синтаксической ошибкой, ознакомьтесь с рабочим кодом здесь на сайте ideone. .


person Nawaz    schedule 12.12.2010    source источник
comment
C++/C были созданы для того, чтобы запутать программистов. Это была четкая цель разработки — максимизировать сложность выражений, которые вы можете написать — плюс в том, что вы можете писать безумно сложный код множеством разных способов — минус в том, что вы можете писать безумно сложный код множеством разных способов.   -  person James Gaunt    schedule 12.12.2010
comment
@James, если вы хотите увидеть язык, который максимизирует сложность выражений, вам следует изучить perl.   -  person SoapBox    schedule 12.12.2010
comment
Честно говоря, я не думаю, что у компиляторов есть какое-то понятие милого или сумасшедшего... это мир GIGO.   -  person BoltClock    schedule 12.12.2010
comment
Я думаю, вы просто привыкли использовать милый вместо сумасшедшего. typedef не является оператором, как sizeof, но, похоже, рассматривается как модификатор, например const или volatile.   -  person Pawel Zubrycki    schedule 12.12.2010
comment
@BoltClock: ну, этот термин GIGO звучит забавно!   -  person Nawaz    schedule 12.12.2010
comment
@Nawaz: Я тебя, конечно, не оскорбляю, извини, если так прозвучало. Просто высмеиваю компиляторов и их личности :P   -  person BoltClock    schedule 12.12.2010
comment
@Bolt Я всегда думал, что это вход, выход... Ха. Наверное, мне нужно многое объяснить...   -  person Maxpm    schedule 19.01.2011


Ответы (4)



Вопрос "почему это вас смущает?"

Синтаксис исходит из грамматики спецификаторов объявлений в 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++.

person Yakov Galka    schedule 12.12.2010
comment
@ybungalobill: этот пост хорош тем, что он знает другой синтаксис. но вопрос остается прежним: зачем позволять разным синтаксисам достигать одной и той же цели? Настоящая проблема в том, что это сбивает программистов с толку относительно того, какой синтаксис действительно отличается и действительно делает разные вещи, а какой синтаксис отличается, но делает одно и то же. Программистам нужно запомнить, скажем, 6 синтаксисов, которые делают ТОЛЬКО 2 разные вещи! - person Nawaz; 12.12.2010
comment
@Nawaz: Проблема в том, что вы считаете эти две формы разными синтаксисами, но на самом деле они одинаковы. Поэтому я могу утверждать, что таким образом вам не нужно запоминать порядок того, что идет первым inline, const, friend или int. - person Yakov Galka; 12.12.2010
comment
@ybungalobill: если вам трудно понять мой комментарий, замените термин «синтаксис» на «формы». Я имею в виду, что пока есть несколько форм, которые делают одно и то же, синтаксис сбивает с толку, потому что есть другой набор форм, которые делают другое. Только представьте, у вас есть 100 форм, которые делают одно, и еще 100 форм, которые делают другое. Эти формы делать излишне сложно! - person Nawaz; 12.12.2010
comment
@Наваз: я не согласен. Я не знаю, какой у вас родной язык, но, например. В русском языке вы можете расположить слова в существительном глаголе всеми 6 возможными способами. Но это никого не смущает. Я думаю, что это применимо и к компьютерным языкам. - person Yakov Galka; 12.12.2010
comment
@Nawaz: Еще один аргумент: можете ли вы объяснить, почему вы предпочитаете одну форму другой? Как выбрать более естественный? - person Yakov Galka; 12.12.2010
comment
@ybungalobill: мы говорим о C++, а не о человеческих языках. И к вашему сведению, человеческие языки используют больше слов, чем компьютеры; человеческие языки являются источником неоднозначностей (именно поэтому C++ Standard использует специальную грамматику для синтаксиса, чтобы уменьшить неоднозначность). Одно предложение (на человеческом языке) интерпретируется по-разному! - person Nawaz; 12.12.2010
comment
@Nawaz: я не говорю, что одно более естественно, чем другое. Все, что я хочу сказать, это то, что если у нас есть один из, то почему Стандарт допускает и другие формы? - person Nawaz; 12.12.2010
comment
@ybungalobill, @Nawaz: Чтобы избежать решения о том, какой из них будет стандартным. Также это может кому-то упростить задачу (В том числе и вам! прочитайте еще раз мой первый комментарий!) - person Yakov Galka; 12.12.2010
comment
@ybugalobill: я не говорю, что одно более естественно, чем другое. Все, что я хочу сказать, это то, что если у нас есть один из, то почему Стандарт допускает и другие формы? (Извините, комментарий выше был предназначен для вас, но в спешке я написал свое имя. LOL. На самом деле моя мама звала меня на ужин.) - person Nawaz; 12.12.2010
comment
@ybugalobill: любая из различных форм может быть стандартной, а все остальные запрещены. И нет, я не думаю, что использование кратных форм/синтаксисов упрощает задачу. Если это так, то я хотел бы знать, когда, в каких ситуациях! - person Nawaz; 12.12.2010
comment
Когда я писал на C#, меня всегда раздражало, что он навязывал порядок виртуального, переопределяющего и прочего. - person Johannes Schaub - litb; 13.12.2010

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

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

person Victor Nicollet    schedule 12.12.2010
comment
Кажется, что typedef находится в том же наборе, что и слово const (можно написать и const int a, и int const a). - person Pawel Zubrycki; 12.12.2010
comment
@Pawel: этот набор называется: decl-specifier - person Yakov Galka; 12.12.2010
comment
Это не усложнит синтаксический анализ, если грамматика недвусмысленна. - person casablanca; 12.12.2010

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

person Mihran Hovsepyan    schedule 12.12.2010
comment
это может иметь небольшое объяснение, если вы думаете в этом направлении: a[1] =› *(a+1) =› *(1+a) = › 1[a]. - person Nawaz; 12.12.2010
comment
Это очень похоже на адресацию на ассемблере, поэтому не так нелогично. - person Pawel Zubrycki; 12.12.2010