Jag försöker kompilera ett program (som jag inte själv har skrivit) och får då följande flmeddelande: hmm, problemet löstes om jag kommentrerar bort "const int INFINITY = -1;" i ../../../include/Tools/string.h på rad 50. Utan att ordentligt satt mig in i ditt problem ser det spontant ut som att du har lokaliserat problemet till att INFINITY är dubbelt deklarerad? Jo, det stämmer att INFINITY redan är definerad (med #define). Den bästa lösningen jag kommit på hittills utan att ändra för mycket i koden är att lägga till #undef INFINITY före deklarationen av konstanten. Problemet är att jag inte äger koden, och att denna patch försvinner när nästa version kommer (programmet är skrivet för SUN7). Jag tror inte själv på att det finns någon bättre lösning (utan att skriva om massa), men man vet ju inte allt. Men om vi säger så här:syntaxfel före "__extension__"
g++ -I../../../include -Wno-deprecated -c DataList.cc
I fil includerad från ../../../include/CMS/DataList.h:11,
från DataList.cc:12:
../../../include/Tools/string.h:50: syntaxfel före "__extension__"
Jag har provat med både gcc, g++ och c++ och med olika parametrar, men med samma resultat. Programmet har tidigare kompilerats (utan problem) under RedHat Linux men nu sitter jag på en RedHat Linux ES. Vad kan det vara för fel?Sv: syntaxfel före "__extension__"
Jag testade att skriva följande script:
#include <math.h>
int main(int, char**) {
const int INFINITY = -1;
}
g++ nothing.cpp
Detta ledde till sama fel, så allt beror på att math.h (och också cmath) deklarera detta. Jag har kommit runt felet genom att ändra i math.h när jag ska kompilera programmet, men det är verkligen ingen bra lösning. Finns något bra sätt att lösa detta utan att ändra i koden.Sv:syntaxfel före "__extension__"
Det är i så fall exakt vad namespaces är till för. Det finns lite olika metoder, men hur du lämpligast gör beror en hel del på vad du kan göra med programmet och filerna.
För det första bör du bara använda cmath - inte math.h.
Antingen ser du till att kapsla in ditt program i ett eget namespace, och refererar till dittnamn::INFINITY, eller så ser du till att inte släppa namespacet, dvs inte skriva "using namespace std" någonstans, utan bara släppa det som är aktuellt.Sv: syntaxfel före "__extension__"
Jag har påpekat problemet för de som ligger bakom koden, så får jag hoppas att de rätta till det till nästa version.Sv:syntaxfel före "__extension__"
1. Du har köpt/fått ett program, skrivet av någon annan?
2. All kod är skriven av denna "någon annan" - du har inte skrivit något själv i den alls?
I så fall är du nog rökt, ja... det vettigaste sättet hade naturligtvis varit att se till att hålla namnrymderna isär, men har du inget inflytande över koden blir det nog svårt...