716 Stimmen

Kann Code, der sowohl in C als auch in C++ gültig ist, ein unterschiedliches Verhalten zeigen, wenn er in jeder Sprache kompiliert wird?

C und C++ haben viele Unterschiede, und nicht jeder gültige C-Code ist auch ein gültiger C++-Code.
(Mit "gültig" meine ich Standardcode mit definiertem Verhalten, d. h. nicht implementierungsspezifisch/undefiniert/etc.)

Gibt es ein Szenario, in dem ein Stück Code, das sowohl in C als auch in C++ gültig ist, zu verschiedene Verhalten bei der Kompilierung mit einem Standardcompiler in jeder Sprache?

Um einen vernünftigen/brauchbaren Vergleich zu machen (ich versuche, etwas praktisch Nützliches zu lernen, und nicht, offensichtliche Schlupflöcher in der Frage zu finden), nehmen wir an:

  • Nichts, was mit dem Präprozessor zusammenhängt (d.h. keine Hacks mit #ifdef __cplusplus pragmas, etc.)
  • Alles, was die Implementierung betrifft, ist in beiden Sprachen gleich (z. B. numerische Grenzwerte usw.)
  • Wir vergleichen relativ neue Versionen der einzelnen Standards (z. B. C++98 und C90 oder später).
    Wenn die Versionen eine Rolle spielen, dann geben Sie bitte an, welche Versionen der einzelnen Programme ein unterschiedliches Verhalten zeigen.

28voto

derobert Punkte 47691

Die Programmiersprache C++ (3. Auflage) nennt drei Beispiele:

  1. sizeof('a'), wie von @Adam Rosenfield erwähnt;

  2. // Kommentare, die zur Erstellung von verstecktem Code verwendet werden:

    int f(int a, int b)
    {
        return a //* blah */ b
            ;
    }
  3. Strukturen usw., die, wie in Ihrem Beispiel, Dinge in unseren Bereichen verstecken.

25voto

Eine weitere, die im C++-Standard aufgeführt ist:

#include <stdio.h>

int x[1];
int main(void) {
    struct x { int a[2]; };
    /* size of the array in C */
    /* size of the struct in C++ */
    printf("%d\n", (int)sizeof(x)); 
}

22voto

fkl Punkte 5248

Inline-Funktionen in C haben standardmäßig einen externen Geltungsbereich, während dies in C++ nicht der Fall ist.

Die Kompilierung der folgenden zwei Dateien zusammen würde im Fall von GNU C die Meldung "I am inline" ausgeben, aber nichts für C++.

Datei 1

#include <stdio.h>

struct fun{};

int main()
{
    fun();  // In C, this calls the inline function from file 2 where as in C++
            // this would create a variable of struct fun
    return 0;
}

Datei 2

#include <stdio.h>
inline void fun(void)
{
    printf("I am inline\n");
} 

Außerdem behandelt C++ implizit jede const weltweit als static es sei denn, sie wird ausdrücklich erklärt extern im Gegensatz zu C, bei dem extern ist die Standardeinstellung.

17voto

wefwefa3 Punkte 3722
#include <stdio.h>

struct A {
    double a[32];
};

int main() {
    struct B {
        struct A {
            short a, b;
        } a;
    };
    printf("%d\n", sizeof(struct A));
    return 0;
}

Dieses Programm druckt 128 ( 32 * sizeof(double) ), wenn sie mit einem C++-Compiler kompiliert werden, und 4 wenn sie mit einem C-Compiler kompiliert werden.

Das liegt daran, dass C nicht über den Begriff der Bereichsauflösung verfügt. In C werden Strukturen, die in anderen Strukturen enthalten sind, in den Geltungsbereich der äußeren Struktur gesetzt.

16voto

struct abort
{
    int x;
};

int main()
{
    abort();
    return 0;
}

Gibt den Exit-Code 0 in C++ bzw. 3 in C zurück.

Mit diesem Trick könnte man wahrscheinlich etwas Interessanteres machen, aber mir fiel kein guter Weg ein, einen Konstruktor zu erstellen, der für C schmackhaft wäre. Ich habe versucht, ein ähnlich langweiliges Beispiel mit dem Kopierkonstruktor zu machen, der die Übergabe eines Arguments zulässt, wenn auch auf eine eher unportable Weise:

struct exit
{
    int x;
};

int main()
{
    struct exit code;
    code.x=1;

    exit(code);

    return 0;
}

VC++ 2005 weigerte sich jedoch, das im C++-Modus zu kompilieren, und beschwerte sich darüber, dass der "Exit-Code" neu definiert wurde. (Ich denke, das ist ein Compiler-Bug, es sei denn, ich habe plötzlich vergessen, wie man programmiert.) Bei der Kompilierung in C wurde der Prozess jedoch mit einem Exit-Code von 1 beendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X