die Main-Methode
-
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.
-
noobLolo schrieb:
Janjan schrieb:
Das nennt sich Sicherheit.
eher schreib geilheit...
Schau dir mein Beispiel an.
Deine Version hätte ein unerwartetes falsches Ergebnis, meine Version würde das richtige tun.
-
Das beantwortet alle Fragenm, vielen Dank
Woher hast du den Text?
-
mngbd schrieb:
3 von 5 Funktionen, über die wir hier tagtäglich philosophieren, werden wahrscheinlich von den meisten Compilern inlined.
ja das kann gut sein
mngbd schrieb:
schon oder 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?
wir reden hier von 2 unterschiedlichen sachen einmal dem text und einmal dem compiler output. im text ist inline hin oder her beides eine function. wird diese aber dann vom compiler geinlined und ist somit nichtmehr reuseable verliert das ding für mich die bezeichnung function...
lg lolo
-
-
noobLolo schrieb:
wir reden hier von 2 unterschiedlichen sachen einmal dem text und einmal dem compiler output. im text ist inline hin oder her beides eine function. wird diese aber dann vom compiler geinlined und ist somit nichtmehr reuseable verliert das ding für mich die bezeichnung function...
So seh ich das auch, ist wohl eine Frage des Standpunktes.
Stört dich eigentlich auch, dass die C-Makros nur so ärmliche Möglichkeiten bieten? Ich fände es sehr toll, wenn man mit denen den Syntax-Baum bearbeiten könnte, und nicht nur den Text. Also mehr so wie zB in Scheme, wo eine offensichtliche Isomorphie zwischen Programm-Text und Syntax-Baum ist.
-
noobLolo schrieb:
wir reden hier von 2 unterschiedlichen sachen einmal dem text und einmal dem compiler output. im text ist inline hin oder her beides eine function. wird diese aber dann vom compiler geinlined und ist somit nichtmehr reuseable verliert das ding für mich die bezeichnung function...
Im Compiler-Output verliert es die Bezeichnung Funktion auch, also was solls.
-
mngbd schrieb:
Stört dich eigentlich auch, dass die C-Makros nur so ärmliche Möglichkeiten bieten?
ja damit hab ich mich schon abgefunden;) aber es gibt ja auch erweiterungen sowas wie m4
mngbd schrieb:
Ich fände es sehr toll, wenn man mit denen den Syntax-Baum bearbeiten könnte, und nicht nur den Text. Also mehr so wie zB in Scheme, wo eine offensichtliche Isomorphie zwischen Programm-Text und Syntax-Baum ist.
hab leider keine ahnung von Scheme und ein kurzer blick auf wiki brachte da keine abhilfe. müßt mich länger damit beschäftigen um die vor- und nachteile beurteilen zu können
-
MatheStein schrieb:
Woher hast du den Text?
Klingt nach C99, das ist ISO/IEC 9899:1999.
noobLolo schrieb:
ja damit hab ich mich schon abgefunden;) aber es gibt ja auch erweiterungen sowas wie m4
m4 kenn ich nicht, werd ich mal nachschlagen.
noobLolo schrieb:
hab leider keine ahnung von Scheme und ein kurzer blick auf wiki brachte da keine abhilfe. müßt mich länger damit beschäftigen um die vor- und nachteile beurteilen zu können
Die Wikipedia-Seite ist Schrott, wenn's dich wirklich interessiert, such nach SICP. Scheme ist irgendwie das C unter den höheren Hochsprachen, kann nur sehr wenig, aber man kann trotzdem bequem alles sagen. Könnte dir gefallen.
-
Janjan schrieb:
Und dann sollte man auch gleich wissen, dass der Code den man da liest Müll ist.
Hab ich was anderes behauptet? In ähnlicher Art habe ich meinen Kommentar im zweiten Satz ja auch bewertet.
Ich habe nie behauptet, dass es ISO C Standard ist. Ich habe nur gesagt, dass es das auch gibt und dass ist nun mal Fakt.
Aber ich hab momentan wichtigere Probleme, als lass uns das vergessen und nicht so spitzfindig sein.