Различия в объявлении размера массива для C и C

#c #c #arrays

#c #c #массивы

Вопрос:

 const int num = 16;
struct inputs{
       double X1[num];
       double X2[num];
};
  

Выдает ошибку:

ошибка: изменено значение ‘X1’ в области действия файла

То же самое было верно для ‘X2’.

Но я помню, что вышесказанное подходит для C , вышесказанное в порядке (возможно, я ошибочно принимаю за C ).

Кто-нибудь может прояснить это для меня?

Ответ №1:

Я могу указать вам на часто задаваемые вопросы по C: я не понимаю, почему я не могу использовать значения const в инициализаторах и измерениях массива.

В основном это говорит о том, что num это не истинная константа, она доступна только для чтения. Чтобы получить истинную константу, вам понадобится #define num 16 .

Также на этой странице: C отличается от C в этом отношении.

Ответ №2:

Да, разница есть. В C const переменная по-прежнему не рассматривается как истинная константа времени компиляции (официально она не является частью a constant expression ), поэтому это запрещено. Обратите внимание, однако, что, хотя C не требует, чтобы компилятор разрешал это, стандарт дает разрешение реализации принимать другие формы постоянных выражений, поэтому она может принять это, если захочет.

В C const переменная рассматривается как константа, поэтому она разрешена.

Интересно, что примерно наоборот, когда вы используете значение, переданное в качестве параметра функции:

 void f(int size) { 
    int array[size];
}
  

Это разрешено в C, но не в C . Это variably modified массив; сообщение об ошибке, которое вы получаете, в основном пытается сообщить вам, что они разрешены только внутри функций.

Комментарии:

1. В C вы можете передать размер массива функции? Узнал ! Спасибо!

2. @Rich: да, но только если ваш компилятор соответствует C99 (по крайней мере, в этом отношении) — это не было включено в C89 / 90 (хотя это было довольно распространенное расширение даже для старых компиляторов).

Ответ №3:

Не в структуре. Вы можете сделать это в локальной области.

Комментарии:

1. Даже для C? Согласно другим ответам, это невозможно для C. может быть, нормально для C ?

2. Я бы доверял Адаму, потому что я не помню точных стандартов. Его версия звучит правдоподобно.

Ответ №4:

В C константы времени компиляции могут использоваться как длины в объявлениях массивов, а const переменные (только некоторые из них) могут быть константами времени компиляции. Вот почему это будет работать на C .

C, однако, имеет функцию, которая выглядит аналогично, массив переменной длины. Это означает, что вы можете использовать любое целочисленное выражение (даже вычисляемое во время выполнения) в качестве длины массива, но только для локальных переменных. Вот почему ваш компилятор жалуется на «изменяемый ‘X1’ в области действия файла«.

Ответ №5:

Вы должны использовать постоянное значение. Поэтому в C вы должны использовать a #define в этом отношении. Для C это было бы нормально.

Используйте это вместо:

 #define num 16
struct inputs{
  double X1[num];
  double X2[num];
};
  

Комментарии:

1. Неудачный выбор слова, означал уважение.

Ответ №6:

Как уже говорилось другими, C и C отличаются в отношении постоянных целочисленных выражений.

Но вам не нужно использовать макрос, как предлагали другие, чтобы иметь код, который работает с обоими. Если вы хотите сделать это с помощью «scope», вы можете сделать это с помощью константы перечисления. Что-то вроде

 enum { num = 16 };
struct inputs {
  double X1[num];
  double X2[num];
};
  

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