[C/C++] Variablennamen bei Funktionsdefinition weglassen
Hallo, vor kurzem wurde hier mal erwaehnt, dass man die Variablennamen bei der Funktionsdefinition (nicht -deklaration) weglassen kann wenn man die Variable nicht verwendet, damit der Compiler keine Warnung ausgibt. Mich wuerde nun interessieren ob dies durch den aktuellen Standard gedeckt ist. Gilt das nur bei C++ oder auch fuer C? Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." -- John Osborne
On Mittwoch, 26. Februar 2003 19:14, Bernhard Walle wrote:
vor kurzem wurde hier mal erwaehnt, dass man die Variablennamen bei der Funktionsdefinition (nicht -deklaration) weglassen kann wenn man die Variable nicht verwendet, damit der Compiler keine Warnung ausgibt.
Mich wuerde nun interessieren ob dies durch den aktuellen Standard gedeckt ist.
Ja.
Gilt das nur bei C++ oder auch fuer C?
AFAIK beide. Bei C++ bin ich mir ganz sicher, bei C zu 90%.
CU
--
Stefan Hundhammer
Moin Berhard, Am Mittwoch, 26. Februar 2003 19:14 schrieb Bernhard Walle:
vor kurzem wurde hier mal erwaehnt, dass man die Variablennamen bei der Funktionsdefinition (nicht -deklaration) weglassen kann wenn man die Variable nicht verwendet, damit der Compiler keine Warnung ausgibt.
Mich wuerde nun interessieren ob dies durch den aktuellen Standard gedeckt ist. Gilt das nur bei C++ oder auch fuer C?
AFAIK ja, Deklaration: int foo(int,int); // in myclass Definiftion: int myclass::foo(int a, int b) { ..... } So habe ich jedenfalls in "C++ Einführung in die Professionelle Programmierung" von U.Breymann gelesen. Grüsse Andre
Bernhard Walle
Mich wuerde nun interessieren ob dies durch den aktuellen Standard gedeckt ist. Gilt das nur bei C++ oder auch fuer C?
Es gilt (leider) nur für C++, dort aber ist es im Standard festgeschrieben. Für C kann ich nur hoffen, dass ein zukünftiger Standard dies übernimmt, so wie C einst die Prototypen von C++ übernahm. Bis dahin ist man leider auf inkompatible Compiler-Features wie beim gcc das __attribute__((unused)) angewiesen. Philipp -- Philipp Thomas Arbeit: pthomas@suse.de Entwicklung, SuSE Linux AG Privat: pth@t-link.de
On Wed, 26 Feb 2003 at 23:51 (+0100), Philipp Thomas wrote:
Bernhard Walle
[26 Feb 2003 19:14:20 +0100]: Mich wuerde nun interessieren ob dies durch den aktuellen Standard gedeckt ist. Gilt das nur bei C++ oder auch fuer C?
Es gilt (leider) nur für C++, dort aber ist es im Standard festgeschrieben.
Danke fuer die Auskunft. Ich hab's fast befuerchtet ...
Für C kann ich nur hoffen, dass ein zukünftiger Standard dies übernimmt, so wie C einst die Prototypen von C++ übernahm.
ACK. Was meinst Du eigentlich mit den Prototypen?
Bis dahin ist man leider auf inkompatible Compiler-Features wie beim gcc das __attribute__((unused)) angewiesen.
Warum implementieren die gcc'ler eigentlich nicht das mit dem Weglassen auch fuer C. Ich meine, das __attribute__((unused)) ist ja auch inkompatibel, dann koennte man wenigstens etwas sinnvolles inkompatibles (immerhin viel kuerzer) machen ... Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ 640 Kilobyte sind genug für jeden. -- Bill Gates (1981)
Hi, On Thu, 27 Feb 2003, Bernhard Walle wrote:
Für C kann ich nur hoffen, dass ein zukünftiger Standard dies übernimmt, so wie C einst die Prototypen von C++ übernahm.
ACK. Was meinst Du eigentlich mit den Prototypen?
Prototypes sind Funktionsdeklarationen, die auch die Typen der Argumente deklarieren. Sie koennen im Kontext einer Funktionsdefinition, oder als simple Deklaration auftreten. Dies ist ne simple Deklaration: int f(int a); Dies ist ne Deklaration mit Definition: int f(int a) { return a; } Beide obigen Dinge deklarieren den Prototypen "int f(int);". Und nein, Prototypen wurden nicht von C++ uebernommen, sondern sind schon in ANSI C90.
Warum implementieren die gcc'ler eigentlich nicht das mit dem Weglassen auch fuer C. Ich meine, das __attribute__((unused)) ist ja auch inkompatibel, dann koennte man wenigstens etwas sinnvolles inkompatibles (immerhin viel kuerzer) machen ...
Zweischneidig. Auf den ersten Blick ist dies eine vernuenftige Idee, nichtdestotrotz aber eine Abweichung vom Standard. Und zwar wuerde es eine _weitere_ sein. Neben den __attribute__'s, die auch noch fuer andere Sachen gut, also universeller sind. Wir versuchen die Zahl der GCC Extensions so klein wie moeglich zu halten. Wenn und falls der Standard in diesem Hinblick mal klueger wird, kommt das auch in GCC rein ;) Oder wenn man genug Leute ueberzeugen kann, das es trotzdem ne gute Idee ist, aber da wuerde ich nicht die Luft anhalten. Ciao, Micha.
Hallo, On Thu, 27 Feb 2003 at 15:42 (+0100), Michael Matz wrote:
On Thu, 27 Feb 2003, Bernhard Walle wrote:
Für C kann ich nur hoffen, dass ein zukünftiger Standard dies übernimmt, so wie C einst die Prototypen von C++ übernahm.
ACK. Was meinst Du eigentlich mit den Prototypen?
Prototypes sind Funktionsdeklarationen, die auch die Typen der Argumente deklarieren. Sie koennen im Kontext einer Funktionsdefinition, oder als simple Deklaration auftreten.
Schon klar.
Und nein, Prototypen wurden nicht von C++ uebernommen, sondern sind schon in ANSI C90.
Ich verstehe jetzt nicht was in C90 aufgenommen wurde. Wie lief das frueher in C ohne Prototypen? Musste die Funktion vor der Verwendung definiert werden (denn ohne Prototypen gibt es ja keine Deklaration ohne Definition) oder konnte sie `einfach so' verwendet werden, d. h. ohne eine Ueberpruefung der Argumente auf Anzahl und Typ. Letzteres waere ja, naja, nicht so toll ;).
Warum implementieren die gcc'ler eigentlich nicht das mit dem Weglassen auch fuer C. Ich meine, das __attribute__((unused)) ist ja auch inkompatibel, dann koennte man wenigstens etwas sinnvolles inkompatibles (immerhin viel kuerzer) machen ...
Zweischneidig. Auf den ersten Blick ist dies eine vernuenftige Idee, nichtdestotrotz aber eine Abweichung vom Standard. Und zwar wuerde es eine _weitere_ sein.
Wie machen das eigentlich andere Compilerbauer (Microsoft/Intel/ Borland)? Warum kann man sich nicht (ohne Standard) auf ein gemeinsames Vorgehen einigen? Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Die Lüge ist wie ein Schneeball: Je länger man ihn wälzt, desto größer wird er. -- Martin Luther
Hi, On Thu, 27 Feb 2003, Bernhard Walle wrote:
Und nein, Prototypen wurden nicht von C++ uebernommen, sondern sind schon in ANSI C90.
Ich verstehe jetzt nicht was in C90 aufgenommen wurde. Wie lief das frueher in C ohne Prototypen?
Tja, eben ohne Typechecking. C startete als wirklich einfache Sprache.
Musste die Funktion vor der Verwendung definiert werden (denn ohne Prototypen gibt es ja keine Deklaration ohne Definition) oder konnte sie `einfach so' verwendet werden, d. h. ohne eine Ueberpruefung der Argumente auf Anzahl und Typ.
Jau. Konnte einfach so verwendet werden. Und damals sahen Funktionsdefinitionen auch so aus (der beruehmte K&R Stil): int f(a) int a; { return a; } Dies ist immer noch in C99 erlaubt, aber schon explizit als obsolet deklariert. Die obige Definition erzeugt uebrigens _keinen_ Prototyp fuer "f", sondern macht nur "f" als Funktion bekannt.
Letzteres waere ja, naja, nicht so toll ;).
Das dachten sich mehrere Leute vor 1990 auch, und erfanden Prototypes ;)
Zweischneidig. Auf den ersten Blick ist dies eine vernuenftige Idee, nichtdestotrotz aber eine Abweichung vom Standard. Und zwar wuerde es eine _weitere_ sein.
Wie machen das eigentlich andere Compilerbauer (Microsoft/Intel/ Borland)? Warum kann man sich nicht (ohne Standard) auf ein gemeinsames Vorgehen einigen?
Naja, das gemeinsame Vorgehen wuerde ja gerade der Standard sein ;-) Es wuerde reichlich sinnlos sein, wenn sich alle compiler-vendors zusammensetzen um Extensions zu definieren, die dann auch alle implementieren, und dies Ding dann doch nicht Standard zu nennen ;) Die Schwierigkeit besteht eben auch darin Agreements zu bekommen. Ciao, Michael.
Am Don, 2003-02-27 um 15.48 schrieb Bernhard Walle:
Hallo,
On Thu, 27 Feb 2003 at 15:42 (+0100), Michael Matz wrote:
On Thu, 27 Feb 2003, Bernhard Walle wrote:
Für C kann ich nur hoffen, dass ein zukünftiger Standard dies übernimmt, so wie C einst die Prototypen von C++ übernahm.
ACK. Was meinst Du eigentlich mit den Prototypen?
Prototypes sind Funktionsdeklarationen, die auch die Typen der Argumente deklarieren. Sie koennen im Kontext einer Funktionsdefinition, oder als simple Deklaration auftreten.
Schon klar.
Und nein, Prototypen wurden nicht von C++ uebernommen, sondern sind schon in ANSI C90.
Ich verstehe jetzt nicht was in C90 aufgenommen wurde. Wie lief das frueher in C ohne Prototypen?
Typischerweise so: func(int, int); func() int a; int b; { int c; /* tu was */ return c; }
Musste die Funktion vor der Verwendung definiert werden (denn ohne Prototypen gibt es ja keine Deklaration ohne Definition) oder konnte sie `einfach so' verwendet werden, d. h. ohne eine Ueberpruefung der Argumente auf Anzahl und Typ. Letzteres waere ja, naja, nicht so toll ;). Beides, nicht umsonst gab es Leute, die bei C von "Macro-Assembler" sprachen.
Warum implementieren die gcc'ler eigentlich nicht das mit dem Weglassen auch fuer C. Ich meine, das __attribute__((unused)) ist ja auch inkompatibel, dann koennte man wenigstens etwas sinnvolles inkompatibles (immerhin viel kuerzer) machen ...
Zweischneidig. Auf den ersten Blick ist dies eine vernuenftige Idee, nichtdestotrotz aber eine Abweichung vom Standard. Und zwar wuerde es eine _weitere_ sein.
Wie machen das eigentlich andere Compilerbauer (Microsoft/Intel/ Borland)?
Die auch beim Gcc verwendete Konvention ist ziemlich weit verbreitet. Willst Du es portabel, dann ignoriere die Warnungen einfach oder schalte die Compileroption ab, die für die Warnung sorgt :-) Es sind Warnungen und keine die Funktion beeinträchtigenden Fehler. Sie sind als Hilfe beim Entwickeln und bei der Fehlersuche gedacht. Wenn Du unter gcc arbeitest, kannst Du die GCC-Konventionen verwenden um die Warnungen los zu werden, u.U. wird ein anderer Compiler dann wiederum Warnungen liefern. __attribute__() würde ich nicht verwenden, da es nicht ganz einfach ist __attribute__() mit Nicht-GCC-Compilern selektiv zu deaktivieren/aktivieren.
Warum kann man sich nicht (ohne Standard) auf ein gemeinsames Vorgehen einigen? Es ist wie mit allen Standards ...
Es dauert, Kommissionen werden gegründet, jeder hat etwas, jeder glaubt besser zu sein als der andere oder hat etwas zu verbergen, jeder hat was proprietäres, das er auf keinen Fall aufgeben möchte, die anderen wollen es auf keinen Fall übernehmen, da sie es ja nicht haben usw. usf. ... Ralf
Hi, On 27 Feb 2003, Ralf Corsepius wrote:
Und nein, Prototypen wurden nicht von C++ uebernommen, sondern sind schon in ANSI C90.
Ich verstehe jetzt nicht was in C90 aufgenommen wurde. Wie lief das frueher in C ohne Prototypen?
Typischerweise so:
func(int, int);
Das ist schon ein Prototyp, also nicht im Uralt-C vorhanden. Um bloss ne Funktion zu deklarieren, ohne zu definieren, so: func (); Das ist uebrigens das, was die ueblichen PARAMS() macros machen. Dies: int func PARAMS((int a, int b)); expandiert je nachdem, was der Kompiler so kann zu: int func (int a, int b); oder int func ();
func() int a; int b;
Und wenn so, dann muss es "func(a,b)" heissen.
Wie machen das eigentlich andere Compilerbauer (Microsoft/Intel/ Borland)?
Die auch beim Gcc verwendete Konvention ist ziemlich weit verbreitet.
??? Meinst du den C++-Teil? Dann ist es kein Wunder, da der Standard dies verlangt. In C gibt's keine solche Konvention, nur die __attributes__.
wiederum Warnungen liefern. __attribute__() würde ich nicht verwenden, da es nicht ganz einfach ist __attribute__() mit Nicht-GCC-Compilern selektiv zu deaktivieren/aktivieren.
Ach was. Ich sag bloss CPP. Maechtiger, guter, problemloesender CPP. Halleluja, CPP ;-) : #ifdef COMPILER_IST_MIST_CLOSED_SOURCE_DRECK #define __ARG_UNUSED #else #define __ARG_UNUSED __attribute__((unused)) #endif int f(int a, int b __ARG_UNUSED) { return a; } Ciao, Micha.
Am Don, 2003-02-27 um 17.38 schrieb Michael Matz:
Hi,
On 27 Feb 2003, Ralf Corsepius wrote:
Und nein, Prototypen wurden nicht von C++ uebernommen, sondern sind schon in ANSI C90.
Ich verstehe jetzt nicht was in C90 aufgenommen wurde. Wie lief das frueher in C ohne Prototypen?
Typischerweise so:
func(int, int);
Das ist schon ein Prototyp, also nicht im Uralt-C vorhanden. Um bloss ne Funktion zu deklarieren, ohne zu definieren, so: func ();
Das ist uebrigens das, was die ueblichen PARAMS() macros machen. Dies: int func PARAMS((int a, int b)); expandiert je nachdem, was der Kompiler so kann zu: int func (int a, int b); oder int func ();
func() int a; int b;
Und wenn so, dann muss es "func(a,b)" heissen. Ja, ja, ... Du hast ja recht ... :-)
Wie machen das eigentlich andere Compilerbauer (Microsoft/Intel/ Borland)?
Die auch beim Gcc verwendete Konvention ist ziemlich weit verbreitet.
??? Meinst du den C++-Teil? Dann ist es kein Wunder, da der Standard dies verlangt. IIRC, kannte selbst der Borland TurboC 2 von anno 89 (??) sie schon ;-)
In C gibt's keine solche Konvention, nur die __attributes__.
wiederum Warnungen liefern. __attribute__() würde ich nicht verwenden, da es nicht ganz einfach ist __attribute__() mit Nicht-GCC-Compilern selektiv zu deaktivieren/aktivieren.
Ach was. Ich sag bloss CPP. Maechtiger, guter, problemloesender CPP. Halleluja, CPP ;-) :
#ifdef COMPILER_IST_MIST_CLOSED_SOURCE_DRECK #define __ARG_UNUSED #else #define __ARG_UNUSED __attribute__((unused)) #endif
int f(int a, int b __ARG_UNUSED) { return a; }
Damit das funktioniert, musst Du es erst einmal verwenden. Mit einem einfachen __attribute__((unused)) wird's problematisch, sofern ein Nicht-GCC __attribute__() mit anderen Argumenten akzeptiert. Ralf
Hi, On 27 Feb 2003, Ralf Corsepius wrote:
Halleluja, CPP ;-) :
#ifdef COMPILER_IST_MIST_CLOSED_SOURCE_DRECK #define __ARG_UNUSED #else #define __ARG_UNUSED __attribute__((unused)) #endif
int f(int a, int b __ARG_UNUSED) { return a; }
Damit das funktioniert, musst Du es erst einmal verwenden. Mit einem einfachen __attribute__((unused)) wird's problematisch, sofern ein Nicht-GCC __attribute__() mit anderen Argumenten akzeptiert.
? Semantic error while parsing sentence ;-) Verstehe ich nicht. Der #ifdef check wuerde checken, ob der Compiler __attribute__((unused)) kann (nicht bloss __attribute__), oder nicht, und wenn nicht, das Makro auf "nix" setzen. Klar muss man natuerlich an alle noetigen Stellen dieses "__ARG_UNUSED" hinzufuegen (wird uebrigens im GCC source auch Tatsache gemacht). Ciao, Micha.
Bernhard Walle
On Wed, 26 Feb 2003 at 23:51 (+0100), Philipp Thomas wrote:
Für C kann ich nur hoffen, dass ein zukünftiger Standard dies übernimmt, so wie C einst die Prototypen von C++ übernahm.
ACK. Was meinst Du eigentlich mit den Prototypen?
Funktionsdeklarationen. Eben das seinerzeit ANSI die heute bekannten Prototypen einführte, sprich das du nicht nur, wie unter K&R, den Rückgabewert deklarierst, etwa so: double blub(); Sondern eben auch die Typen der Argumente: double blub(int count, double bubble); Und eben in der Definition nicht double blub(count, bubble) double bubble; { } sondern double blub(int count, double bubble) { }
Warum implementieren die gcc'ler eigentlich nicht das mit dem Weglassen auch fuer C. Ich meine, das __attribute__((unused)) ist ja auch inkompatibel, dann koennte man wenigstens etwas sinnvolles inkompatibles (immerhin viel kuerzer) machen ...
Das wäre erstens nicht mehr Standardkonform, denn das Weglassen des Namens ist laut ISO C ein eindeutiger Fehler. Also dürfte dieses Feature nur per explizitem Schalter aktiviert werden. Zweitens wäre dafür ein nicht trivialer Eingriff in den Parser nötig, während __attribute__ längst implementiert ist. Und drittens sind die Bemühungen derzeit eher, GCC-Erweiterungen zu *reduzieren*, da in der Vergangenheit zuviele unausgegorene Erweiterungen eingeführt wurden, die dann später bei der Weiterentwicklung des GCC sehr viel Kopfschmerzen bereitet haben. Philipp -- Philipp Thomas Arbeit: pthomas@suse.de Entwicklung, SuSE Linux AG Privat: pth@t-link.de
Michael Matz
Und nein, Prototypen wurden nicht von C++ uebernommen, sondern sind schon in ANSI C90.
Und? C++ beginnt nicht erst mit ISO und 1990 gab es längst AT&Ts cfront :) Prototypen sind, wenn ich mich nicht fürchterlich irre, von Anfang an Bestandteil von C++ gewesen. Und ich meine mich auch entsprechender Aussagen auf comp.std.c zu erinnern. Philipp -- Philipp Thomas Arbeit: pthomas@suse.de Entwicklung, SuSE Linux AG Privat: pth@t-link.de
participants (6)
-
Andre Heine
-
Bernhard Walle
-
Michael Matz
-
Philipp Thomas
-
Ralf Corsepius
-
Stefan Hundhammer