gug-bg-herd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [debian] [avifile/C++] Молба за съвет относно #564868: FTBFS with g


From: George Danchev
Subject: Re: [debian] [avifile/C++] Молба за съвет относно #564868: FTBFS with gcc-4.5
Date: Thu, 14 Jan 2010 00:31:59 +0200
User-agent: KMail/1.12.4 (Linux/2.6.30-2-686; KDE/4.3.4; i686; ; )

Yavor Doganov writes:
> Георги Данчев wrote:
> > статични членове (константни или не) се инициализират така:
> > http://www.icce.rug.nl/documents/cplusplus/cplusplus11.html
> 
> Не виждам нищо смущаващо в avm_output.h; сигурно нещо съществено ми
> убягва?

Имах предвид, че поне аз предпочитам да инициализирам статичните членове 
веднага след дефиницията на класа към който принадлежат; както съм го дал в 
примера. В случая инициализацията е в cорса файла, това е окей, но е 
неправилно написана, виж по-долу, как трябва да е.
 
> > Освен това, не е ясно върнатия указател от това new къде отива, май
> > искате да е в m_pSelf:
> 
> Това признавам и на мен не ми е ясно...

Това изглежда недовършено, и не е ясно дали някога е работило както авторите 
са очаквали.

> > Бах, от де взе GCC 4.5, gcc-snapshot от experimental не е 4.5,
> > доколкото виждам.
> 
> Как да не е?
> 
> address@hidden:~$ /usr/lib/gcc-snapshot/bin/g++ --version | head -1
> g++ (Debian 20091228-2) 4.5.0 20091228 (experimental) [trunk revision
>  155486]
> 
> 4.5 е следващата (все още неиздадена) версия, със сигурност няма да
> бъде стандартния компилатор в Squeeze.

Правилно, моя грешка.

> > > [2] http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#176
> > > [3] http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#382
> > > [4] http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#147
> >
> > Тези май са за други случаи ;-)
> 
> Точно така си го обяснявам и аз, но гледайки кръпката [1] за
> диагностиката на GCC, в случая оплакването е нещо като „side effect“
> или „false positive“ заради реализацията на тази част от новия
> стандарт.
> 
> [1] http://gcc.gnu.org/ml/gcc-patches/2009-11/msg01378.html

Ами да, това потвърждава тезата, че сега с 4.5 невалидния код се диагностицира 
като грешка:

Give helpful error for constructor name used as type.

> > Доколкото знам само компилаторите могат да извикват конструктори
> > Тип::Тип, а ти се опитваш и да връщаш това. Това което искаш е само
> > Тип или Тип* ;-)
> 
> 4.4 го приема за тип, 4.5 го приема за конструктор, а се очаква тип.
> 
> Не може дефиницията да е просто
> 
>   AvmOutput* AvmOutput::m_pSelf = 0;

Абсолютно законен код, приема се и от GCC 4.5. Тип има защото вече имаме 
дефиниция на типа AvmOutput, вижда се вече на този етап защото се включва от 
хедъра #include "avm_output.h". 

Незаконен C++ код е:

AvmOutput::AvmOutput* AvmOutput::m_pSelf = 0;


> защото логично компилатора се оплаква, че няма такъв тип.
> 
> > Аз доколкото знам typename се използва само във връзка с шаблони,
> 
> Не и от GCC 4.5 нататък, доколкото мога да разбера.
> 
> [*] http://gcc.gnu.org/ml/gcc-patches/2009-06/txt00006.txt

Това е нещо ново за мен, и този пач премахва коментара:
/* The `typename' keyword is only allowed in templates.  */

но това не доказва, че:

typename AvmOutput::AvmOutput* AvmOutput::singleton()
{}

или:

AvmOutput::AvmOutput* AvmOutput::m_pSelf = 0;

е законен код с новия компилатор.


> > за това което се опитвате да имплементирате не са ви нужни такива
> > приложения по мое мнение.
> 
> Чакай, чакай...  Защо говориш в мн.ч.? :-)  avifile е изоставен пакет
> в Дебиан; опитах се да коригирам по-сериозните грешки защото е
> зависимост на мой пакет (cynthiune.app), както и да направя всичко
> възможно да се компилира на всички архитектури.  Не ме вълнува този
> пакет въобще, дори видях зор да изровя файлове за тестване...  Така че
> нищо не се опитвам(е) да имплементирам(е), просто аз лично се опитвам
> да коригирам всяка грешка, която мога.
> 
> Та на въпроса: какъв според теб е правилния подход в случая?

Честно да ти кажа, незнам. Според мен, това:

AvmOutput::AvmOutput* AvmOutput::singleton()
{                                           
    assert(m_pSelf != 0);                   
    return m_pSelf;                         
}     

не е валиден C++98 код, но 4.4 компилатора го позволява, а 4.5 просто е по-
стриктен, хваща го и не го харесва с право. Можем само да предполагаме, че 
авторите са искали да имплементират singleton, но не се прави така, виж линка 
който дадох в предния мейл. Сега, ако почнеш да ги оправяш нещата, със 
сигурност ще удариш в още и още код който трябва да се изправи, а аз не мисля, 
че е добра идея да си губиме времето със счупен код, при положение, че може да 
се инвестира в други по-добри свободни кодове.

-- 
pub 4096R/0E4BD0AB <people.fccf.net/danchev/key pgp.mit.edu>

reply via email to

[Prev in Thread] Current Thread [Next in Thread]