die Main-Methode
-
Und dann sollte man auch gleich wissen, dass der Code den man da liest Müll ist.
-
Hey Leute,
bei mir schluckt aber ein und derselbe Compiler (gcc) beide Signaturen und dieser ist doch ein reiner C-Compiler und unterstütz somit doch eigentlich keine polymorphen Funktionen oder?
Gruß
-
Entschuldigung.. Ich meinte nicht "polymorphen Funktionen" sondern "überladenen Funktionen"
Gruß
-
Wo hat man denn eine polymorphe / überladene Funktion?
Entweder mit Argumenten, oder Ohne. Beides geht nicht.
Der Compiler sorgt dafür, dass diese Funktion entsprechend mit oder ohne Argumenten aufgerufen wird bei Programmstart.
-
eine function ist doch auch nur eine adresse die gecallt wird also was du vorher auf den stack packst ist der function dann normalerweise gleich du solltest aber dafür sorgen das du das was da drauf kommt auch wieder runter kommt. wie du das machst ist gleich.
functionen lassen sich casten wie jede variable auch und daher lassen sich auch mehr oder weniger variablen auf den stack packen(stdcall)
lg lolo
-
MatheStein schrieb:
polymorphen Funktionen
gehen nur über umwege da die code section idr. schreib geschützt ist und muß daher in die text section aber dafür ist c bzw. die compiler normal nicht ausgelegt
-
noobLolo schrieb:
MatheStein schrieb:
polymorphen Funktionen
gehen nur über umwege da die code section idr. schreib geschützt ist und muß daher in die text section aber dafür ist c bzw. die compiler normal nicht ausgelegt
ups ich war gerade bei polymorphen code das ist bischen was anderes
-
Doch der gcc akzeptiert bei mir beide Signaturen unter Ubuntu. Kannst es selber testen
#include<stdio.h> int main(){ printf("Hallo Welt\n"); return 0; }
wird genau so akzeptiert wie
#include<stdio.h> int main(){ printf("Hallo Welt\n"); return 0; }
...........................
ok der main funktion kann es egal sein, ob vor ihrem Funktionsaufruf Daten auf den Stack gepackt werden, da ein Sprung aus main gleichbedeutend mit dem Programmende ist.
Hat mich trotzdem nur gewundert, dass ein und derselbe Compiler beide Signaturen
int main()
int main(int argc, char** argv)
akzeptiert was aber denke ich nur bei der main-Methode so ist, da nur diese vom Compiler fest vorgeschrieben ist oder?
Gruß
-
noobLolo schrieb:
eine function ist doch auch nur eine adresse die gecallt wird
Nein. Eine Funktion ist in C das abstrakte Konzept einer Abbildung von Eingabe- zu Rückgabewerten, durch die Angabe eines Algorithmus, der das Berechungsverfahren beschreibt. Wenn eine Funktion nur eine Adresse ist, wie erklärst du dann, was Inlining ist?
-
MatheStein schrieb:
#include<stdio.h> int main(){ printf("Hallo Welt\n"); return 0; }
wird genau so akzeptiert wie
#include<stdio.h> int main(){ printf("Hallo Welt\n"); return 0; }
Und es wundert dich, dass zwei auf das Zeichen übereinstimmende Schnippsel den gleichen Effekt haben?
-
MatheStein schrieb:
Doch der gcc akzeptiert bei mir beide Signaturen unter Ubuntu. Kannst es selber testen
Und jetzt schalte Warnungen und nutze --std=c89 (oder nur 1 -?).
-
mngbd schrieb:
noobLolo schrieb:
eine function ist doch auch nur eine adresse die gecallt wird
Nein. Eine Funktion ist in C das abstrakte Konzept einer Abbildung von Eingabe- zu Rückgabewerten, durch die Angabe eines Algorithmus, der das Berechungsverfahren beschreibt. Wenn eine Funktion nur eine Adresse ist, wie erklärst du dann, was Inlining ist?
Inlining ist eine optimierung des compilers und hat wenig mit einer function gemeinsam da sie dann nicht mehr existiert. am ende ist das ganze programm ein algorithmus der in form eines parsetree dargestellt werden kann. functionen sind wiederholt verwendete code blöcke zu denen gesprungen werden kann. damit sich das ding function nennen darf muß es eine adresse besitzen zu der du springen kannst. sonst ist es einfach inline code und keine function ein "#define add(a,b) (a+b)" wird ja auch nicht als function bezeichnet.
lg lolo
-
noobLolo schrieb:
in "#define add(a,b) (a+b)" wird ja auch nicht als function bezeichnet.
Stimmt. Das ist ein kaputtes Makro.
-
Janjan schrieb:
Stimmt. Das ist ein kaputtes Makro.
dann zeig mir das doch mal als intaktes makro baby
-
noobLolo schrieb:
Janjan schrieb:
Stimmt. Das ist ein kaputtes Makro.
dann zeig mir das doch mal als intaktes makro baby
Um dein Makro mal zu verbessern:
#define add(a,b) ((a)+(b))
-
Janjan schrieb:
noobLolo schrieb:
Janjan schrieb:
Stimmt. Das ist ein kaputtes Makro.
dann zeig mir das doch mal als intaktes makro baby
Um dein Makro mal zu verbessern:
#define add(a,b) ((a)+(b))
den sinn hab ich noch nie begriffen
#define add(a,b) (a+b) #define mul(a,b) (a*b) mul(5,add(3,4)) == 35;
#define add(a,b) ((a)+(b)) #define mul(a,b) ((a)*(b)) mul(5,add(3,4)) == 35;
#define mul(a,b) (a*b) mul(5,3+4) == 19;//wieso hat der depp das add(,) macro nicht verwendet...
evtl. weil ich keinen anderen an meinen source lass :p
-
ist nur 1 "-"
Gibt aber immer noch keine Fehlermeldung/Warnung oder sonst was.
Der nimmt beide Versionen problemlos hin.Habe es nun auch mal unter Windows getestet und wieder wurden beide Versionen akzeptiert.
Ist C vllt so spezifiziert, dass beide Versionen gelten?
Gruß
-
noobLolo schrieb:
Janjan schrieb:
noobLolo schrieb:
Janjan schrieb:
Stimmt. Das ist ein kaputtes Makro.
dann zeig mir das doch mal als intaktes makro baby
Um dein Makro mal zu verbessern:
#define add(a,b) ((a)+(b))
den sinn hab ich noch nie begriffen
Das nennt sich Sicherheit.
Nehmen wir folgenden aufruf:
add(1 << 3, 6)
Dies wird ersetzt zu: (1 << 3 + 6).
Problem: + hat eine höhere Priorität als <<, also hast du folgendes:
(1 << (3 + 6)) - Nicht was man erwartet hat, wenn man das Makro nutzt.Mit den extra Klammern wäre das nicht passiert. Und die extra Klammern kosten nichts.
Da trennt sich die Spreu vom Weizen.
-
Janjan schrieb:
Das nennt sich Sicherheit.
eher schreib geilheit...
5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent;9) or in some other implementation-defined manner.
-
MatheStein schrieb:
Ist C vllt so spezifiziert, dass beide Versionen gelten?
C ist so spezifiziert, dass
void
oder die beiden Parameter dort sein dürfen; oder dass main() eine Implementations-spezifische Signatur haben darf. Auf jeden Fall gültig sind aber nur die ersten beiden Varianten.noobLolo schrieb:
Inlining ist eine optimierung des compilers und hat wenig mit einer function gemeinsam da sie dann nicht mehr existiert. am ende ist das ganze programm ein algorithmus der in form eines parsetree dargestellt werden kann. functionen sind wiederholt verwendete code blöcke zu denen gesprungen werden kann. damit sich das ding function nennen darf muß es eine adresse besitzen zu der du springen kannst. sonst ist es einfach inline code und keine function ein "#define add(a,b) (a+b)" wird ja auch nicht als function bezeichnet.
Eine Funktion mit dem inline-Attribut ist also gar keine Funktion? Obwohl der Compiler dafür sorgen muss, dass niemand ihre Adresse verwenden will?
3 von 5 Funktionen, über die wir hier tagtäglich philosophieren, werden wahrscheinlich von den meisten Compilern inlined. Müssen sie aber nicht, selbst wenn das inline dabeisteht. Also entscheidet der Compiler, was eine Funktion ist? Aber halt, das kann ja jeder Compiler sehen, wie er will... ist bei dir vielleicht nur das eine Funktion, was man unter keinen Umständen inlinen kann?
Ach ja: Makros sind natürlich Makros, und keine Funktionen. Also Dinge, die mit Text arbeiten und nicht mit typisierten Variablen.