Ich habe mich gefragt, warum der folgende Code nicht kompiliert:
void foo_int(int *a) { }
void foo_long(long *a) { }
int main()
{
int i;
long l;
foo_long(&i);
foo_int(&l);
}
Ich verwende GCC, und weder die Aufrufe funktionieren in C noch in C++. Da es sich um ein 32-Bit-System handelt, sind sowohl int als auch long vorzeichenbehaftete 32-Bit-Integer (was zur Compile-Zeit mit sizeof überprüft werden kann).
Der Grund, warum ich frage, ist, dass ich zwei separate Header-Dateien habe, die nicht unter meiner Kontrolle sind, und eine tut so etwas wie: typedef unsigned long u32;
und die andere: typedef unsigned int uint32_t;
. Die Deklarationen sind im Grunde kompatibel, außer wenn ich sie als Zeiger verwende wie im obigen Code-Schnipsel, muss ich explizit casten.
Irgendeine Idee, warum das so ist?
0 Stimmen
Gute Frage und interessante Antworten. Wahrscheinlich ist die technisch sinnvolle Lösung, eines der Header-Datei-Typdefinitionen zu ändern - obwohl dies möglicherweise aus anderen Gründen schwierig ist, wie Sie sagten.