Fatal
написал 15 июля 2004 года в 22:46 (5686 просмотров)
Ведет себя
как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.
const int A=20;
int main(void){
int m[A]={1,2,3,4,5,6,7,8,9,0};
…
return 0;
}
Если вместо const int A=20 подставить #define A 20, то компилироваться будет без предупреждений. Почему такая вещь происходит?
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
А какие предупреждения?
У меня он ошибку выдает, а не предупреждение: error: variable-sized object may not be initialized, потому как считает, что я пытаюсь создать массив переменной длины. Для компилятора
#define A 20
int m[A] = {…};
полностью эквивалентна
int m[20] = {…};
потому как подстановка 20 вместо А происходит на этапе прекомпиляции. А константа для компилятора все равно остается переменной.
Good Luck,
UT
Нормально!
Константа остается переменной?!
Видать каждый компилятор это трактует по своему. В Винде все работает без предупреждений.
На сколько я знаю const * вместо #define — это C++. C++ вообще не приветствует использование препроцессора (например inline functions instead of macros etc.).
Удачи
— sas
Many thanks
Фича в том, что в C «const ;» — это объявление переменной, из которой можно только читать. Т.е. сама переменная никуда не денется после компиляции. А в C++ — это объявление константы, которая подставиться в процессе компиляции и физически существовать не будет, есть только вы не сделаете что-то типа «&;».
Есесно, что если в C написать:
const int size = 10;
int a[size];
то выскочит ошибка, так как это расценивается, как попытка создать массив размер которого на этапе компиляции неизвестен.
Что касается компиляции этого под маздаем, то интересно какой компилятор это скомпилил, уж не VC++ 6.0?
Что такое маздаем?
Да это я пробовал в Studio.NET
маздай = must die = windows
Ну что касается студии .NET, знаю только, что C++ компилятор (с помощью Саттера) им удалось привести к 100% совместимости со стандартом. На C наверное подзабили…
Маленькое уточнение:
Насколько я помню,
С препроцессор, на самом деле работает как sed, т.е. просто напросто производит замену одной строчки на другую. После этого измененный исходник передается компилятору.
Константа в С++ имеет
1) тип, который компилятор может использовать для проверок и генерации лучшего кода.
2) у нее есть область действия.
3) Да, нормальный компилятор попробует не хранить ее в скомпилированом коде, используя ее значение только на этапе компиляции (символьные таблицы), однако это не всегда возможно (например константные объекты неинтегральных типов). В этих случаях место будет выделено.
Удачи
— sas
Короче, чего тут рассусоливать? Смотрим в ISO/IEC 9989:1999 (C)и ISO/IEC 14882:1998 (C++), уточняем и закрываем топик нафиг. ;)
int func(int a)
{
int massive[a];
…
return 0;
}
Я читал в доке по libc что это будет работать, но это GNU расширение.