PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linkerfehler: Visual Studio vs. GCC


mekakic
2013-04-11, 09:40:11
Folgender Code produziert bei Bauen mit GCC wie VC2012 einen Linker-Error mit "already defined"

/// A.cpp
int doppelter_symbolname;

/// B.cpp
int doppelter_symbolname;

Folgender Code kompiliert bei Visual Studio problemlos und GCC liefert hier ebenfalls "already defined".

/// A.cpp
int doppelter_symbolname_unterschiedlicher_typ;

/// B.cpp
bool doppelter_symbolname_unterschiedlicher_typ;

Ist das richtig? Bei VS scheint der Typ irgendwie zur Namenssignatur zu gehören... wer verhält sich da denn richtig? Oder ist das nicht spezifiziert?

Danke :)

mksn7
2013-04-11, 11:14:21
Das kann so nicht richtig sein.

Richtig Spaßig wirds ja dann bei:


void fun( int blubb) {
...
}

void fun( bool blubb) {
...
}

...

fun(doppelter_symbolname_unterschiedlicher_typ);

Gast
2013-04-11, 11:21:02
Das kann so nicht richtig sein.

Richtig Spaßig wirds ja dann bei:


void fun( int blubb) {
...
}

void fun( bool blubb) {
...
}

...

fun(doppelter_symbolname_unterschiedlicher_typ);

Und was soll bei dem Code jetzt das Problem sein?

RLZ
2013-04-11, 11:22:40
Ich würde vermuten, der GCC handelt hier richtig.
Globale Variablen ohne static sind aber noch verdächtiger, als globale Variablen ohnehin schon...

mksn7
2013-04-11, 14:47:42
Weil der Compiler nicht entscheiden kann, welche der beiden überladenen Funktionen er ausführt.

Odal
2013-04-11, 22:44:09
wenn es sich um eine globale variablendeklaration handelt ist es ja klar das gleicher name unterschiedlicher typ beim linken failt

bei funktionsdeklarationen dürfte bool a(int) und int a(int) avuch failen da es ja genauso uneindeutig ist schliesslich lässt sich selbst bei der Funktionsverwendung nicht immer festmachen was benutzt wird.

z.B. a(int) ohne Auswertung des returntyps

void fun( int blubb) {
...
}

void fun( bool blubb) {
...
}

das ist ja ganz normales Überladen und über die funktionssignatur durch den verwendeten funktionsparameter eindeutig identifizierbar

im ernstfall hat der gcc eh (fast) immer recht da vs tonnenweise fehler teils "wortlos" ignoriert und am standard vorbei akzeptiert und anhand der semantik autofixt

Exxtreme
2013-04-11, 23:16:29
Ich könnte mir vorstellen, dass der GCC intern nicht zwischen int und bool unterscheiden kann.

Passiert das gleiche auch mit:

/// A.cpp
float doppelter_symbolname_unterschiedlicher_typ;

/// B.cpp
bool doppelter_symbolname_unterschiedlicher_typ;

?

Ectoplasma
2013-04-12, 01:51:37
Ich würde eher sagen, dass es dazu keine Regel gibt. Währe "doppelter_symbolname" eine Funktion,


/// A.cpp
int doppelter_symbolname_unterschiedlicher_typ() {
return 0;
}

/// B.cpp
bool doppelter_symbolname_unterschiedlicher_typ {
return false;
}
, dann müsste auch VS eine Fehlermeldung ausgeben.