|
Тема
|
[C++] Интересен проблем...
|
|
Автор |
DonAngel (void) |
Публикувано | 08.01.03 12:28 |
|
Дали следният код според вас е по стандарт?
-----
#include "stdlib.h"
int f1()
{
return 0;
}
int f2()
{
return 1;
}
int main(int argc, char* argv[])
{
int sss max(f1(),f2()); // ТУК!!
return 0;
}
-----
Този код се компилира без проблем от следните компилатори:
- Visual C 6 (задължително конзолна апп, или трябва да смените stdlib.h с minmax.h ако използвате MFC)
- SUN CC
Очевидно тези, които успяват да го компилират, свеждат "проблема" до декларация на функция - след като препроцесора мине, се получава нещо като:
int sss ((f1()) > (f2()) ? (f1()) : (f2()));
Следните компилатори дават грешка:
- Cameau online compiler () дава и по-нормална грешка;
- HP CC (определено най-стандартният от "истинските" компилатори, които пробвахме). Дава и най-човешката грешка ("очаква се '='")
- GCC 2.96 - parse error :) - личи от от 100 км Lex/Yacc-a в него
Въпроса е - ДАЛИ този израз е по ISO 14992 или не е? Как мислят експертите? Май не е (щото най-стандартните се издъниха), но все пак?
Поздрави!
Д.Редактирано от DonAngel на 08.01.03 12:31.
| |
Тема
|
Re: [C++] Интересен проблем...
[re: DonAngel]
|
|
Автор | code_grinder (Нерегистриран) |
Публикувано | 08.01.03 14:13 |
|
mi ocehwidno kato max e nehsto deto e definirano kato (....)
se poluchawa
int sss(...);
( koeto e syshtoto kato
int sss=...; )
koeto e dopustim nachin za inicializacia na lokalni (auto)
promenliwi - s izrazi koito ne sa konstanta
t.e. bazowite tipowe kato int, char, double mogat da bydat
inicializirani po "OO maniewr"
tia kompilatori deto gi citirash iawno max e definirano po stranen nachin
a moje i da ne e kato makros a kato funkcia? :)
| |
|
Именно - вероятно в компилаторите, които дават грешка, max() не е макрос, а template функция. А в GCC/G++ по-специално, max() въобще не е дефинирана в stdlib.h (стандартното и място е в <algorithm>, и е std::max).
| |
Тема
|
Re: [C++] Интересен проблем...
[re: Pesho®]
|
|
Автор |
DonAngel (void) |
Публикувано | 08.01.03 16:07 |
|
Господа, не така ;)
Във всички компилатори има библиотечната функция (която общо-взето е библиотечен макрос - за да е универсален относно типизацията и да е в същото време C) max! Дефиниран е по следният начин:
#define max(a, b) ((a) > (b) ? (a) : (b))
Expand-ването му довежда до кода, който съм сложил по-горе :). Въобще не става въпрос за викане на функция (още по-малко от STL - да видяхте някъде using namespace?) или каквото и да е там - просто този код е взет (по стечение от обстоятелствата) от един мой сорс, и съдържа банална грешка - липсващ знак за равно '='. Обаче - М$ и SUN компилират кода - щото смятат че е декларация на функция (вътре в тялото на функция). Добре, че НР спаси положението и откри синтактичната грешка.
Подобен код е напълно компилируем във VC:
----
int main(int argc, char *argv[])
{
int f(3);
....
}
----
Което ДОСТА ме озадачи!
Въпроса е - доколко това са бъгове в компилатор(ите), и доколко това е стандартен израз...
Май трябваше да пиша [Expert C++] в subject-a... :)
Поздрави!
Д.
| |
|
Мдааа, ясно, очевидно си прав. За жалост пиша това *след* като отговорих на Пешо по-горе и преди да помисля добре (отвратителен навик).
Един колега потвърди, след което и аз проверих - наистина става въпрос за автоматична инициализация на променлива. Това, което ме обърка допълнително беше и факта, че под НР мах продължава да е *макрос*, а не някаква функция. Т.е. - просто горкото НР е нестандартно! Интересно защо Camue, което има претенции да е стандартен компилатор, се изложи? Странна работа!
Поздрави!
Д.
| |
Тема
|
Re: [C++] Интересен проблем...
[re: DonAngel]
|
|
Автор |
Pesho® (деструктор) |
Публикувано | 08.01.03 16:43 |
|
Че code_grinder е прав, няма спор. Но това, че във всички компилатори има макрос max, не е вярно. В ISO/IEC 14882 стандарта, max() се среща само веднъж, и то в <algorithm>. Точка 25.3.7, страница 562. Очевидно ползваш GCC 2.9x, там е имало макрос max(), но е бил нестандартен extension, нищо повече. В GCC 3.x и новото libstdc++, няма такъв макрос.
| |
Тема
|
Re: [C++] Интересен проблем...
[re: Pesho®]
|
|
Автор |
DonAngel (void) |
Публикувано | 08.01.03 16:46 |
|
Прав си, max като С++ *стандарт* я има само в СТЛ.
Но за жалост, повечето компилатори го имат къде в stdlib.h, къде в minmax.h (VC).
Слава богу обаче, че това не беше бъг (а по чудо се е оказало инициализация на променлива) - иначе отдавна щях да разбера за него по не особено приятен начин :).
Поздрави!
Д.
| |
|
|
|
|