Версии компиляторов и стандартов С++

Модератор: Модераторы разделов

Шпунтик
Сообщения: 230
ОС: MSDOS 3.3

Версии компиляторов и стандартов С++

Сообщение Шпунтик »

Наконец-то основательно взялся за изучение С++. Купил книгу Шилдта "С++: для начинающих" (Самоучитель шаг за шагом).
Уже неделю вдумчиво изучаю эту книгу. В книге довольно часто встречается примерно такое предложение - "Конкретная реализация этого может быть разной в разных версиях компиляторов. За подробной информацией обращайтесь к документации на данный компилятор".
Например, в описании цикла for пишется, управляющая переменная может быть объявлена внутри цикла for. В этом случае данная переменная существует только внутри этого цикла (область видимости). Далее Шилдт пишет, что ранее в стандарте С++ объявленная таким образом переменная существовала (была видима) и за пределами этого цикла, но в новой версии С++ ANSI/ISO эта переменная определяется только внутри данного цикла. Это только один из примеров разницы стандартов и версий компиляторов.
Вопрос: к какой документации обратиться чтобы узнать конкретные детали реализации каких-то вещей в определённой версии gcc?

ИМХО, из-за такого разнобоя могут проистекать ошибки. Например пограмма написана с учётом одного стандарта а компилируется компилятором придерживающегося другого стандарта.

Каким образом избегать подобных коллизий?

P.S. Когда-то один знакомый программист сравнивая Паскаль и С++ сказал, что С++ разрешает почти всё, из-за этого он похож на бензопилу без кожуха. Требуется постоянная внимательность что б чего ненароком не отпилить :)
Путь линуксоида очень напоминает путь воина, главными особенностями которого являются ответственность и самодисциплина. Но и награды этого пути достойны: это свобода и мастерство.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Версии компиляторов и стандартов С++

Сообщение NickLion »

Шпунтик писал(а):
13.05.2009 23:24
Каким образом избегать подобных коллизий?

Например писать так, чтобы не было такой ситуации:

Код: Выделить всё

int i;
for( i = 0; ...

Но лично мне так не нравится.

И еще, документация - man gcc, как ни удивительно:
-ffor-scope
-fno-for-scope
If -ffor-scope is specified, the scope of variables declared in a for-init-statement is limited to the for loop itself, as specified by the standard. If -fno-for-scope is specified, the scope of variables declared in a for-init-statement extends to the end of the enclosing scope, as was the case in old versions of G++, and other (traditional) implementations of .

The default if neither flag is given to follow the standard, but to allow and give a warning for old-style code that would otherwise be invalid, or have different behavior.
Спасибо сказали:
Аватара пользователя
COKPOWEHEU
Сообщения: 47
ОС: Debian (ядро 4.4.2) / Win7

Re: Версии компиляторов и стандартов С++

Сообщение COKPOWEHEU »

Линукс тоже разрешает почти все, особенно для Рута.
Я так думаю, методом Монте-Карло :) (методом тыка). Пишешь прогу, компилируешь, если компилятор не понимает - выдаст ошибку. По-моему таким способом запороть что-либо сложно. Гораздо вероятнее ошибка в логике программы. Более научных способов не знаю.
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Версии компиляторов и стандартов С++

Сообщение Olegator »

Шпунтик писал(а):
13.05.2009 23:24
Например, в описании цикла for пишется, управляющая переменная может быть объявлена внутри цикла for. В этом случае данная переменная существует только внутри этого цикла (область видимости). Далее Шилдт пишет, что ранее в стандарте С++ объявленная таким образом переменная существовала (была видима) и за пределами этого цикла, но в новой версии С++ ANSI/ISO эта переменная определяется только внутри данного цикла. Это только один из примеров разницы стандартов и версий компиляторов.
Вопрос: к какой документации обратиться чтобы узнать конкретные детали реализации каких-то вещей в определённой версии gcc?

все стандарты, поддерживаемые gcc и параметры описаны в доке http://gcc.gnu.org/onlinedocs/. Какой определите стандарт, с тем и будет компилировать
Спасибо сказали: