[C++] Интересен проблем...

6 отговора 510 прегледа
#1

[C++] Интересен проблем...

Дали следният код според вас е по стандарт?
-----
#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 на

Отговор
в отговор на DonAngel #2

Re: [C++] Интересен проблем...

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? :)

Отговор
в отговор на code_grinder #3

Re: [C++] Интересен проблем...

Именно - вероятно в компилаторите, които дават грешка, max() не е макрос, а template функция. А в GCC/G++ по-специално, max() въобще не е дефинирана в stdlib.h (стандартното и място е в <algorithm>, и е std::max).

Отговор
в отговор на Pesho® #4

Re: [C++] Интересен проблем...

Господа, не така ;)
Във всички компилатори има библиотечната функция (която общо-взето е библиотечен макрос - за да е универсален относно типизацията и да е в същото време 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... :)

Поздрави!
Д.

Отговор
в отговор на code_grinder #5

Re: [C++] Интересен проблем...

Мдааа, ясно, очевидно си прав. За жалост пиша това *след* като отговорих на Пешо по-горе и преди да помисля добре (отвратителен навик).
Един колега потвърди, след което и аз проверих - наистина става въпрос за автоматична инициализация на променлива. Това, което ме обърка допълнително беше и факта, че под НР мах продължава да е *макрос*, а не някаква функция. Т.е. - просто горкото НР е нестандартно! Интересно защо Camue, което има претенции да е стандартен компилатор, се изложи? Странна работа!

Поздрави!
Д.

Отговор
в отговор на DonAngel #6

Re: [C++] Интересен проблем...

Че code_grinder е прав, няма спор. Но това, че във всички компилатори има макрос max, не е вярно. В ISO/IEC 14882 стандарта, max() се среща само веднъж, и то в <algorithm>. Точка 25.3.7, страница 562. Очевидно ползваш GCC 2.9x, там е имало макрос max(), но е бил нестандартен extension, нищо повече. В GCC 3.x и новото libstdc++, няма такъв макрос.

Отговор
в отговор на Pesho® #7

Re: [C++] Интересен проблем...

Прав си, max като С++ *стандарт* я има само в СТЛ.
Но за жалост, повечето компилатори го имат къде в stdlib.h, къде в minmax.h (VC).
Слава богу обаче, че това не беше бъг (а по чудо се е оказало инициализация на променлива) - иначе отдавна щях да разбера за него по не особено приятен начин :).

Поздрави!
Д.

Отговор