Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 01:55 21.05.24 
Компютри и Интернет
   >> Програмисти
Всички теми Следваща тема *Кратък преглед

Тема [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? :)



Тема Re: [C++] Интересен проблем...нови [re: code_grinder]  
Автор Pesho® (деструктор)
Публикувано08.01.03 14:53



Именно - вероятно в компилаторите, които дават грешка, 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... :)

Поздрави!
Д.



Тема Re: [C++] Интересен проблем...нови [re: code_grinder]  
Автор DonAngel (void)
Публикувано08.01.03 16:29



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

Поздрави!
Д.




Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.