Portierungs-Problem C => C++

Enumerator

Mitglied Kamel
Hi!

Ein Kollege von mir hat meinen alten C-Code nach C++ Portieren wollen, genauer gesagt er hat eine Klasse geschrieben die die API um eine Struktur "wrapt".
Da die Member-Funktionen eigentlich nur die C-API aufrufen hat er die Member-Variablen als "const" und "public" deklariert - um laut eigener Aussage soetwas wie "Deskriptoren in Python" zu simulieren.
Wir haben also eine Struktur (C) und eine Klasse (C++) die genau den gleichen Zweck haben. Nun produziert die C++-Variante allerdings hin und wieder SEGFAULTs und damit beginnt unser Streit und hiermit meine Frage:
Bewirkt der "const"-Qualifier in C++ durch Kompiler-Optimierungen die Fehler oder hat mein uralter C-Code auf einmal Fehler?
Ich selbst bin nicht allzu fit in C++, doch ich halte ersteres für wahrscheinlicher.
Den Quellcode selbst erspare ich Euch - es geht nur um den Grundsatz ob oben beschriebene Technik okay ist oder Bullshit - die Fehlersuche mach' ich wenn dann schon selbst.

Gruß
Enum
 
klar kann das passieren, weil du logischerweiße const-variablen nicht ändern darfst.
Mit compileroptimierungen hat das nix zu tun :)
Zu beachten gäbe es auch noch die zuweißung constanter werte über den konstruktor.
 
Eben das sind auch meine Argumente, doch der werte Herr Kollege hält dagegen dass die Methoden selbst nicht als const deklariert wurden und somit der Compiler davon ausgehen muss dass sich die Member ändern könnten auch wenn sie konstant sind.
Wie dem auch sei, ich bin inzwischen davon überzeugt dass "Bullshit" die richtige Antwort auf meine Frage ist - ich habe einfach den Compiler angewiesen keinerlei Optimierungen durchzuführen und siehe da ------- keine SEGFAULTs.
Da die zugrunde liegende C-Bibliothek nicht neu übersetzt wurde (seit Version 0.2 nicht, und die hat schon ein paar Jährchen auf dem Buckel :) ) werden die Reparaturen zum Glück nicht an mir hängen bleiben.
 
@sheel: Nein, ich glaube der Kollege von Enumerator meint, dass das eine Optimierung machen könnte, wenn man Get()-Funktionen als const definiert:
C++:
class TTest
{
  public:
    int a;
    int b;
   
    int inline GetA() const  // Mit const eine Optimierung meint "der Kollege"
    {
      return a;
    }
    int inline GetB()  // Ohne const
    {
      return b;
    }
};
Oder habe ich was falsch verstanden?
 
Weder noch. Ein abstraktes Beispiel:

C:
/* das nadelöhr zwischen c/c++ */
typedef struct c c_t;

/* bibliotheks-funktion aus der c-api, z.b. { return ++c->member; }  */
int tu_was_mit_c(c_t*);

/* die struktur selbst ist in c nicht öffentlich, aber das ist hier nebensache */
struct c {
    int member;
};

C++:
/* das nadelöhr zwischen c/c++ */
typedef struct cpp c_t;

/* die (imho völlig überflüssige) wrapper-struktur */
struct cpp {
    cpp(int n): member(n) {}
    int tu_was(void) { return tu_was_mit_c(this); }
    const int member;
};
 
Deine Wrapper-Struktur ist aber in C (bzw. keine Klasse).

Aber irgendwie habe ich das Problem nicht verstandne. Der Code hat mich jetzt irgendwie verwirrt :confused:
 
Ich war auch ein wenig verwirrt als ich das zum ersten mal gesehen habe. Aber eigentlich ist es ganz einfach; 1) nein, die Struktur unten ist nicht C, eindeutig C++ und 2) beide Versionen erzeugen exakt das gleiche Speicherabbild (solang keine virtuellen Methoden implementiert werden).
Über den typedef c_t ist es möglich Instanzen der jeweiligen Sprach-version and die C-API zu übergeben, was auch prima funktioniert.
Nur leider wird es kompilziert wenn z.b. member-Variablen Pointer sind. Der Qualifizierer in "TYP *const member;" wird dann mitunter zu SEGFAULTS führen da der Compiler nicht immer zwingend den member wieder addressiert, da er ja konstant zu sein scheint.
 
Zurück