private: wie?



  • Die Frage ist jetzt nicht ganz so blöde, wie der Titel es nahelegt:

    Wenn ich ein C-Programm schreibe und verhindern möchte, dass Symbole innerhalb eines Moduls für den Linker sichtbar werden, dann deklariere ich die entsprechenden Funktionen bzw. Variablen als "static". Schwuppdiwupp kann ich zwei Funktionen mit gleichem Namen in unterschiedlichen Files miteinander verlinken.

    Angenommen, ich benenne diese beiden Module jetzt von .c nach .cpp um, um sie so, wie sie sind innerhalb eines C++-Projektes zu verwenden. Dann funktioniert das mit dem "static" nicht mehr, plötzlich werden sie nach außen hin sichtbar.

    Nur: wie mache ich es dann, wenn ich diese Funktionen eben nicht in eine Klasse packen kann/will/darf? "private:" Außerhalb von Klassen fällt ja weg und "static" bedeutet was anderes - also wie geht es dann?



  • In C++ benutzt man dafür den namenlosen Namensraum:

    namespace {
      void ich_bin_nur_hier_sichtbar() { } // "hier" meint dabei diese Übersetzungseinheit
    }
    

    Allerdings sollte sich die Bedeutung von static außerhalb von Klassen eigentlich nicht verändern. Welchen Compiler benutzt du?



  • Die Bedeutung von "static" ändert sich von C nach C++, das ist einfach eine compilerunabhängiges Fehldesign der Sprachen und sowohl mit VC als auch mit GCC zu beobachten.



  • Markram schrieb:

    Die Bedeutung von "static" ändert sich von C nach C++, das ist einfach eine compilerunabhängiges Fehldesign der Sprachen und sowohl mit VC als auch mit GCC zu beobachten.

    Also in diesem Fall sollte sich an der Bedeutung von static nichts ändern. Bei globalen Objekten/Funktionen erzeugt es internal Linkage.

    @TE:
    Was für einen Compiler nutzt du denn, so dass es sich bei dir anders verhält? Ich seblst bevorzuge allerdings auch die Variante mit den anonymen Namespaces 😉

    Eine frage an alle:

    Wenn ich in zwei Übersetzungseinheiten je eine Funktion mit dem gleichen Name definiere, dabei die eine static die andere nicht. Wieso erhalte ich dann keinen Linkerfehler? Benennt der Compiler die statische Funktion irgendwie um, so dass es für den Linker keine identischen Funktionen mehr sind?

    Lg freeG



  • Markram schrieb:

    Die Bedeutung von "static" ändert sich von C nach C++, das ist einfach eine compilerunabhängiges Fehldesign der Sprachen und sowohl mit VC als auch mit GCC zu beobachten.

    Das halte ich jetzt mal glatt für ein Gerücht!


Log in to reply