Namen von anonymen Namespaces beeinflussen



  • MSVC scheint die Namen für anonyme Namespaces nicht zufällig auszuwürfeln wie andere Compiler, sondern sie anhand des Pfades bzw. der File-ID zu vergeben. Lässt sich das irgendwie ändern?

    Grund ist: wir bauen ein und die selbe LIB aus dem selben Set aus Files mehrfach, mit unterschiedlichen vordefinierten Makros und unterschiedlichen Include-Pfaden. So bekommen wir mehrere LIBs die ihre Symbole in unterschiedlichen Namespaces definieren und gegen unterschiedlichen Versionen von einer Third-Party Library linken.

    Diese LIBs werden dann zum Schluss alle in die selbe DLL zusammengelinkt.

    Sobald allerdings in einem Header-File ein anonymer Namespace verwendet wird, bekommen wir Linkerfehler -- weil MSVC immer die selben Namen für die anonymen Namespaces verwendet.

    Lässt sich das irgendwie fixen ohne dass wir die Source Files für unsere LIB im Build Script mehrfach umkopieren müssen?



  • @hustbaer sagte in Namen von anonymen Namespaces beeinflussen:

    Lässt sich das irgendwie ändern?

    Zeig mal? dann spiel ich rum.



  • Naja bei diesem Programm:

    #include <stdio.h>
    #include <typeinfo>
    
    namespace {
    
    struct Foo {
    	static void test() {
    		printf("%s\r\n", typeid(Foo).raw_name());
    	}
    };
    
    }
    
    int main() {
    	Foo::test();
    }
    

    kommt bei mir immer der selbe Output raus, auch wenn ich es neu baue. Sogar wenn ich es mit anderen vordefinierten Makros neu baue.

    Der Name des anonymen Namespaces ändert sich wenn ich das .cpp File umbenenne. Nur genau das will ich eigentlich vermeiden.

    Ich kann dabei beliebige Compiler-Switches mitgeben. Ein "forced include" wäre auch kein Problem (verwenden wir sogar schon). Hab aber bisher nix gefunden. Bei GCC ist das ganze kein Problem, GCC würfelt sich immer nen neuen Seed für die Generierung von anonymen Namespace Namen. (Kann man wenn man möchte per Commandline überschreiben, aber per Default bekommt man zufällige Namen.)



  • This post is deleted!


  • Du kannst einen zufälligen Namen generieren lassen (z.B.: https://stackoverflow.com/questions/23032002/c-c-how-to-get-integer-unix-timestamp-of-build-time-not-string) und dann using namespace benutzen. Ich weiß nicht, ob das äquivalent ist, aber das sollte es sicher tun.



  • @Hubert-Alfonsius
    Danke für deine Antwort, aber das "tut es" leider nicht. Es geht nämlich nicht nur um unseren eigenen Code sondern auch Zeugs wie Boost. Und 1 Mio. lokale Patches für Boost & Co. zu machen ist nicht praktikabel. Erstens weil viel zu viel Aufwand und zweitens weil viel zu fehleranfällig.


Log in to reply