nixp.ru v3.0

17 января 2017,
вторник,
13:58:06 MSK

DevOps с компанией «Флант»
Fatal написал 15 июля 2004 года в 22:46 (2010 просмотров) Ведет себя как мужчина; открыл 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, то компилироваться будет без предупреждений. Почему такая вещь происходит?

anonymous

А какие предупреждения?

Uncle Theodore

У меня он ошибку выдает, а не предупреждение: error: variable-sized object may not be initialized, потому как считает, что я пытаюсь создать массив переменной длины. Для компилятора

#define A 20

int m[A] = {…};

полностью эквивалентна

int m[20] = {…};

потому как подстановка 20 вместо А происходит на этапе прекомпиляции. А константа для компилятора все равно остается переменной.

Good Luck,

UT

Fatal

Нормально!

Константа остается переменной?!

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

sas

На сколько я знаю const * вместо #define — это C++. C++ вообще не приветствует использование препроцессора (например inline functions instead of macros etc.).

Удачи

— sas

Fatal

Many thanks

myst

Фича в том, что в C «const ;» — это объявление переменной, из которой можно только читать. Т.е. сама переменная никуда не денется после компиляции. А в C++ — это объявление константы, которая подставиться в процессе компиляции и физически существовать не будет, есть только вы не сделаете что-то типа «&;».

Есесно, что если в C написать:

const int size = 10;

int a[size];

то выскочит ошибка, так как это расценивается, как попытка создать массив размер которого на этапе компиляции неизвестен.

Что касается компиляции этого под маздаем, то интересно какой компилятор это скомпилил, уж не VC++ 6.0?

Fatal

Что такое маздаем?

Да это я пробовал в Studio.NET

myst
Что такое маздаем?

маздай = must die = windows

Да это я пробовал в Studio.NET

Ну что касается студии .NET, знаю только, что C++ компилятор (с помощью Саттера) им удалось привести к 100% совместимости со стандартом. На C наверное подзабили…

sas
myst
А в C++ — это объявление константы, которая подставиться в процессе компиляции и физически существовать не будет, есть только вы не сделаете что-то типа «&;».

Маленькое уточнение:

Насколько я помню,

С препроцессор, на самом деле работает как sed, т.е. просто напросто производит замену одной строчки на другую. После этого измененный исходник передается компилятору.

Константа в С++ имеет

1) тип, который компилятор может использовать для проверок и генерации лучшего кода.

2) у нее есть область действия.

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

Удачи

— sas

myst

Короче, чего тут рассусоливать? Смотрим в ISO/IEC 9989:1999 (C)и ISO/IEC 14882:1998 (C++), уточняем и закрываем топик нафиг. ;)

anonymous

int func(int a)

{

int massive[a];

return 0;

}

Я читал в доке по libc что это будет работать, но это GNU расширение.

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.