Forum: Compiler & IDEs GCC Invalid conversion Errors abschalten


von Michael D. (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei für ein eigenes Projekt ein fremdes Library 
einzubinden. Hierbei verwende ich 2 unterscheidliche gcc Kompiler:

gcc 4.4.3 für X86 Architektur unter Eclipse
gcc 4.5.2 für ARM Architektur unter Eclipse

Das externe Lib verwendet sehr viele void*, welche dann bei einem 
Funktionsaufruf übergeben werden - die Funktion verlangt z.B. einen 
struct xyz*) als Parameter.

Für X86 kann ich dass Library erstellen, solche Sachen werden nur als 
Warnings ausgegeben, das Library funktioniert aber.

Der ARM Compiler schmeißt mir hier aber Fehler.

Lassen sich die checks auf solche Fehler irgendwie abschalten?

Habe bereits angefangen manuell Typecasts einzufügen (da ich weiß was 
die Funktion erwartet) allerdings werde ich hierbei ziemlich alt, da das 
Library ziemlich umfangreich ist.

Danke,
Mike

von Andreas B. (andreas_b77)


Lesenswert?

In C sollten sich void-Zeiger und andere Zeiger auch ohne Cast 
ineinander umwandeln lassen. Sicher, dass nicht versehentlich als C++ 
übersetzt wird? Dateiendungen mit .C statt .c gelten für gcc automatisch 
als C++, wenn nicht über eine Option was anderes angegeben wird.

von Michael D. (Gast)


Lesenswert?

Hallo,

vielen Dank für deinen Ratschlag!

An dem lags leider nicht, das Projekt wurde als c angelegt, alle Dateien 
enden mit .h oder .c (beides klein). Eclipse meldet beim Builden auch 
dass es den gcc c Compiler verwendet (Invoking: GCC C Compiler)

Leider bekomme ich unmengen folgender Fehler (Beispiel):
error: invalid conversion from 'void*' to 'phFriNfc_OvrHal_t*'
wo dann halt nur ein Typecast hilft.

Trotzdem Danke!
Mike

PS: Kleiner Nachtrag zu meinem ersten Post: Es scheitert nicht am 
eigenen Projekt sondern dan den exterene Sourcen welche ich zu einem 
Shared Object builden soll - was unter X86 klappt, unter ARM eben halt 
nicht.
Ich würd so ein hin und her casting nicht verwenden. Grausam zum lesen, 
noch grausamer zum debuggen.

von Karl H. (kbuchegg)


Lesenswert?

Michael D. schrieb:

> Ich würd so ein hin und her casting nicht verwenden. Grausam zum lesen,
> noch grausamer zum debuggen.


Wenn du schon im Code eingreifst, dann mach dir eine(!) Hilfsfunktion, 
die den Cast übernimmt und die Version mit dem void Pointer aufruft. Und 
die restlichen Aufrufe ersetzt du durch einen Aufruf dieser 
Hilfsfunktion.

Auf die Art hast du dann den Cast nur an einer Stelle und wenn sich dann 
rausstellt, dass noch mehr zu tun ist, anstatt nur zu casten, dann hast 
du dann auch gleich die eine einzige Stelle, an der du eingreifen musst.

von Rolf Magnus (Gast)


Lesenswert?

Wie sieht denn die Compiler-Kommandozeile aus? Man kann per 
Compiler-Schalter solche Fehlermeldungen auch in C einschalten.

von void* (Gast)


Lesenswert?

Also ehlrich leute.

Das ist völlig normal, das man void* nicht auf einen Typ* zuweisen kann.

ANDERSRUM ist es IMMER möglich.

von Oliver (Gast)


Lesenswert?

Hast du mal ein Codebeispiel?

Das folgende Beispiel compiliert der arm-gcc 4.5.2 auf meinem Rechner 
selbst mit "-pedantic -Wall -Wextra" ohne zu meckern:
1
void* vp;
2
int* ip;
3
4
int i, j;
5
6
struct mystruct {
7
  int si;
8
} s;
9
struct s* sp;
10
11
int foo(struct mystruct* sp) {
12
  return sp->si;
13
}
14
15
int bar(int* ii) {
16
  return *ii;
17
}
18
19
int main(void) {
20
21
  i = 3;
22
23
  ip = &i;
24
  vp = &i;
25
  ip = vp;
26
  i = *ip;
27
28
  bar(vp);
29
30
  s.si = 5;
31
  vp = &s;
32
33
  foo(vp);
34
35
  return 0;
36
}

Oliver

von Michael D. (Gast)


Lesenswert?

Hallo Leute,
vielen Dank für Eure Unterstützung.

Wie immer saß der Fehler vorm Rechner (bitte um Nachsicht, ich bin 
Linux-Neuling)

Ich hatte in den Projektsettings beim C Kompilerpfad 
Toolchain.../...g++ angegeben... Eine Änderung auf gcc brachte hier 
Hilfe.

void* schrieb:
> Das ist völlig normal, das man void* nicht auf einen Typ* zuweisen kann.

Trotzdem macht jeder ein

int *p = malloc(123);

was in meinem Fall auch nicht funktioniert hat.

Danke nochmals,
Mike

von Rolf Magnus (Gast)


Lesenswert?

Michael D. schrieb:
> void* schrieb:
>> Das ist völlig normal, das man void* nicht auf einen Typ* zuweisen kann.

Nein, ist es absolut nicht!

> Trotzdem macht jeder ein
>
> int *p = malloc(123);
>
> was in meinem Fall auch nicht funktioniert hat.

In C muß das funktionieren, sonst ist der Compiler kaputt oder 
explizit so konfiguriert. In C++ darf es nicht funktionieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.