gcc pointer cast warnungen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
wanne
Moderator
Beiträge: 7553
Registriert: 24.05.2010 12:39:42

gcc pointer cast warnungen

Beitrag von wanne » 12.03.2013 19:17:16

Hi, ich möchte gerne dass das gcc nicht mehr meckert, wenn ich einen Pointer zu einem Pointer caste. (Also am liebsten währe ich nur die casts von und auf void Pointer los.)
Also z.B. sowas:

Code: Alles auswählen

expected ‘void **’ but argument is of type ‘char **’
-Wno-cast-align hilft leider nichts.

Hintergrund: Ich habe relativ viele Funktionen, die mehr oder weniger Polymorph sind. Jedes mal auf void* zu casten macht das ganze eher unübersichtlicher.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: AW: gcc pointer cast warnungen

Beitrag von Natureshadow » 13.03.2013 09:31:42

Die Warnungen gibt es mit gutem Grund.

Fix deinen Code …

wanne
Moderator
Beiträge: 7553
Registriert: 24.05.2010 12:39:42

Re: gcc pointer cast warnungen

Beitrag von wanne » 13.03.2013 12:31:10

Natureshadow hat geschrieben:Die Warnungen gibt es mit gutem Grund.
Nein. Der "fix" ist wie schon angemerkt schlicht alle Pointer explizite zu casten. Darauf habe ich aber keine Lust. Der code wird dadurch, dass er zu 50% aus casts besteht nicht übersichtlicher. Ich halte es durchaus für vernünftig das C Pointer implizit castet. Viele andere Programmirsprachen casten weit mehr implizit (z.B. muss in der Bash praktisch gar nichts gecastet werden) und der Code ist deswegen auch nicht falsch.
rot: Moderator wanne spricht, default: User wanne spricht.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: gcc pointer cast warnungen

Beitrag von Cae » 13.03.2013 12:43:20

Evtl. kann man ein Macro bauen, was die Casts dazubaut und die eigentliche Funktion bereitstellt:

Code: Alles auswählen

#include <stdio.h>

#define foo(a, b) __foo((void *)(a), (void *)(b))

void __foo(void *bar, void *baz) {
	printf("__foo(%p,%p)\n", bar, baz);
}

int main(void) {
	char *bar = NULL;
	char *baz = bar+1;

	foo(bar, baz);

	return 0;
}
Ist zwar immernoch haesslich und verhindert, dass wirkliche Fehler erkannt werden, aber es vermeidet Riesenhaufen an Casts.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten