Использование const с typedef-ed type - PullRequest
1 голос
/ 05 декабря 2011

Следующий код прекрасно компилируется на большинстве компиляторов (включая Microsoft Visual Studio's - cl, Minimalist GNU для Windows - MinGW), но не работает на Digital Mars Compiler - dmc с ошибкой: Error: type qualifiers and static can only appear in outermost array of function parameter

const int MAXLENGTH32 = 32;
typedef char String32[MAXLENGTH32];

void f1(const String32 tokens[]) {

}

int main() {

    return 0;
}

Я хотел бы заявить следующее:

  1. Первая причина, по которой я публикую это, состоит в том, чтобы получить экспертное мнение о том, почему код не работает на популярном компиляторе (БьярнеСам Страуструп рекомендует его http://www2.research.att.com/~bs/compilers.html). Основная проблема, по-видимому, заключается в использовании const с параметром. Если вы удалите const, код прекрасно скомпилируется на компиляторе DMC .

  2. Вторая важная причина заключается в том, что в моем исследовании возможного объяснения сбоя компиляции я не встречал каких-либо убедительных объяснений. Хуже того, я натолкнулся на предложение: «Программисты на C ++ просто избегаютusing const ". Далее автор сказал, что довольно сложно понять, что именно сказано в спецификации об использовании const в сценарии.Нарио, как указано выше, и именно из-за этого происходит то, что const, как модификатор типа, не находится в D (перефразировать).

  3. Последняя личная причина для этого постачто самые исключительные вещи, которые я узнал о языке C ++, были получены из-за того, что он не занимал такую ​​позицию, как «компилирует на всех остальных, так черт побери и двигается».Да.Очень хочу услышать мнение эксперта о том, что может привести к тому, что то, что кажется нормальным кодом, не сработает на DMC компиляторе.Спасибо.

1 Ответ

5 голосов
/ 05 декабря 2011

Очевидное объяснение состоит в том, что в dmc есть ошибка.Сообщение об ошибке очень запутанно: для начала, static не может появиться где-либо в параметре функции, как внешне, так и иначе.Что касается квалификаторов типов, то в стандарте ясно, что классификаторы типов в массиве применяются к отдельным элементам массива (и это применяется рекурсивно).Написанное канонически, объявление вашей функции будет выглядеть следующим образом:

void f1(String32 const* tokens)

, которое после применения typedef становится:

void f1( char const (*tokens)[MAXLLENGTH32] );

Что вполне допустимо.

...