Fehler beim Releasen von cpp programm in VisualStudio

Nun, was heißt schon „ähnlich“. C++ ist ~„eine Erweiterung von C“, und schleppt damit ungeheuere Altlasten mit sich rum. Macros und der Präprozessor könnten praktisch wegfallen, aber … können das halt nicht, weil es schon immer so war. Außerdem ist der Teil, der über C hinausgeht, viel größer, als der „C-Kern“ selbst. Auch wenn sowas wie Implicit conversions - cppreference.com sich erstmal nur auf den Kern bezieht, und dieser Kern komplett unterspezifiziert ist, und man bei C++ mit size_t und int32_t versucht hat, dem ganzen etwas mehr Form und Strenge zu geben, hat man immer nur Dinge hinzugefügt, was das ganze nicht leichter gemacht hat.

Und selbst wenn man meint, sich damit auszukennen, stelle ich immer wieder gerne diese Aufgabe:

int32_t add(int32_t x, int32_t y) {
    ...
    return ... ;
}

Die Funktion soll die beiden gegebenen Zahlen addieren. Wie implementiert man das?

Bisher habe ich noch nie gesehen, dass jemand diese Frage „richtig“ beantworten konnte.


Aber um das nicht zuuuu sehr zu C++ - Bashing abdriften zu lassen: Wenn man das ganze ausführlich lernt, sauber und gewissenhaft programmiert, und versucht, CppCoreGuidelines/CppCoreGuidelines.md at master · isocpp/CppCoreGuidelines · GitHub so weit zu berücksichtigen, wie das möglich ist, kann man damit schon ein paar vernüftige Sachen machen.

Der Punkt ist: Wenn man diese Funktion dann mit add(2000000000, 2000000000) aufruft, hat man einen signed integer overflow, und das ist dann Undefined Behavior - d.h. der Computer könnte dann irgendwas machen. Z.B. ein falsches Ergebnis liefert. Neu booten. Sich aufhängen. Die Festplatte formatieren. Oder ein lustiges Katzenvideo abspielen. Irgendwas eben.

Hallo Marco13,

melde mich nach einigen Tagen wegen Schulstress mal wieder.

Habe etwas ausprobiert, dass bei mir funktioniert hat:

#include <iostream>

using namespace std;

int32_t add(int32_t x, int32_t y) {

    int z = x + y;

    return x + y;

}

int main() {

    int z = add(1, 1);

    cout << z << endl;

}

Kann sein das es nicht ganz deinen Erwartungen entspricht.

Ja, wie gesagt: Wenn du genau dieses Programm compilierst und startest, aber mit add(2000000000, 2000000000), dann wird eine negative Zahl ausgegeben. Aber… das muss nicht sein. Es könnte sein, dass das Programm dann abstürzt. Oder deine Festplatte löscht. Oder sich aufhängt. Oder ein lustiges Katzenvideo abspielt. Undefined Behavior ist Undefined Behavior.

Der Punkt ist: Der C++ - Standard sagt einfach nichts darüber aus, was dieses Programm dann machen wird. Und … das finde ich nicht gut.

Interessant das da eine negative Zahl rauskommt.

Habe eine Frage, kennst du irgendne Platform / PDF / Website bei der / denen man c++ recht ausführlich lernen kann ?

Die negative Zahl ist so gesehen nicht überraschend. Das ist auch bei "richtigen" Spachen (wie Java) so. In einem 32-bit-int hat so eine große Zahl einfach keinen Platz. Der Punkt ist:

Der C++ - Standard sagt nicht sowas wie:

  • „Da kommt diese-und-jene negative Zahl raus“ oder
  • „Da kommt irgendeine negative Zahl raus“ oder
  • „Das Ergebnis ist nicht genau definiert“ oder
  • „Das Ergebnis kann dann falsch sein“
  • oder oder oder

Der C++ - Standard sagt, dass das „Undefined Behavior“ ist. Das heißt selbst bei dem komplexesten C++ - Programm der Welt gilt: Wenn diese Zeile ausgeführt wird, kann man danach über das Programm keine Aussage mehr machen. Punkt.

EDIT: Eine gute Quelle für C++ - Learning-Material kenne ich nicht, es gibt da zu viele Eventualitäten. Du kannst zwar Tutorials lesen, aber muss damit rechnen, dann über C++ Core Guidelines zu browsen, und (bei dem Teil, den du verstehst) zu merken, dass du 1. viel Mist gelernt hast, und 2. viele Dinge nicht gelernt hast…

anders ausgedrückt - jeder Compiler kann dort was anderes machen

ok danke, ich habe jetzt grade noch eine Frage. Ich will eine dll erstellen und in eine anwendung einbinden. Ich habe gelesen, dass man dazu eine lib braucht, aber ich bekomme beim debuggen und releasen keine. Wisst ihr wie ich diese bekommen kann ?

du musst dich zwischen DLL und LIB entscheiden

ich weiß, ich nehme dll aber in allen tutoriels benötigt man eine lib, hab bei microsoft zum glück nen eintrag gefunden. Hat sich geklährt.