[solved] problem mit msvc 8.0 - min/max macro-/funktionen-verwirrung



  • hallo,

    i hab folgendes problem: i versuch die tvmet (a template-lib für lineare algebra) in mein projekt einzubinden. tvmet is jedoch für mei version von msvc noch net freigegeben. scheinbar verwechselt der compiler funktionen mit den namen min und max mit den gleichnamigen macros. eigentlich eigenartig, da die methoden mit bereichsauflöser verwendet werden und in 'nem namespace gekapselt sind, das sollte der compiler doch wohl checken?

    static inline
      bool equals(argument_type lhs, argument_type rhs) {
        static base_type sqrt_epsilon(
          NumericTraits<base_type>::sqrt(
            std::numeric_limits<base_type>::epsilon()));
    
        return traits_type::norm_inf(lhs - rhs) < sqrt_epsilon *
          std::max(std::max(traits_type::norm_inf(lhs),
    			traits_type::norm_inf(rhs)),
    	       std::numeric_limits<base_type>::min()); // <-------------
      }
    

    1>c:\sdk\tvmet-1.7.2\include\tvmet\numerictraits.h(108) : warning C4003: not enough actual parameters for macro 'min'

    das max schmeisst hier eigenartigerweise keinen fehler

    static inline
      bool equals(argument_type lhs, argument_type rhs) {
        static base_type sqrt_epsilon(
          NumericTraits<base_type>::sqrt(
            std::numeric_limits<base_type>::epsilon()));
    
        return traits_type::norm_inf(lhs - rhs) < sqrt_epsilon *
          std::max(std::max(traits_type::norm_inf(lhs), // <-------------
    			traits_type::norm_inf(rhs)),
    	       std::numeric_limits<base_type>::min());
      }
    

    1>c:\sdk\tvmet-1.7.2\include\tvmet\numerictraits.h(637) : error C2589: '(' : illegal token on right side of '::'

    hier gibts einen fehler bei max, jedoch keinen bei min. ???

    also das is jetzt nur a vermutung von mir. jemand a idee was da los ist und was ma dagegen unternehmen kann? irgendwelche compiler-/preprocessor-einstellungen diesbezüglich? bin mit meiner weisheit a bissl am ende...

    bittedanke!



  • iko79 schrieb:

    eigentlich eigenartig, da die methoden mit bereichsauflöser verwendet werden und in 'nem namespace gekapselt sind, das sollte der compiler doch wohl checken?

    Tja, das ist das "Schöne" an Makros, sie scheren sich einen Dreck um Kapselung oder Namensräume. Makros sind eine stumpfe Textersetzung, die stattfindet, bevor der Compiler den Code überhaupt zu Gesicht bekommt.

    Dir bleibt nur, die Definition dieser Makros zu verhindern, rückgängig zu machen (#undef) oder hinter diesen Code zu schieben.



  • vor dem Include von windows.h:

    #define NOMINMAX
    


  • okay, hab jetzt die include-reihenfolge geändert...

    danke euch beiden!

    Superlexx schrieb:

    #define NOMINMAX
    

    *lol* sehrgeil....



  • Eine Library die von vornherein Makros mitliefert die sich mit der STL schneiden gehoert auf den Mond geschossen *find* Wo haste das her? WinAPI?



  • pumuckl schrieb:

    Eine Library die von vornherein Makros mitliefert die sich mit der STL schneiden gehoert auf den Mond geschossen *find* Wo haste das her? WinAPI?

    Tja, was soll man machen, wenn man eine C-Library verwenden will 😉 (die WinAPI war für C entwickelt und strotzt deshalb nur von Makro-Definitionen)

    Wenigstens war Microsoft so clever, das Problem zu erkennen - wenn du NOMINMAX definiert hast, werden die Makros min() und max() nicht übersetzt und du kannst die Namen nutzen.



  • pumuckl schrieb:

    Wo haste das her? WinAPI?

    von hier. wurde irgendwo in der boost-uBLAS dokumentation empfohlen (!) falls man mit vektoren/matrizen bekannter abmessungen arbeitet und diese noch dazu relativ klein sind. die empfehlung such' i seither verzweifelt und find sie nimmer... 😕



  • @iko79: Nächstes Mal bitte ohne Dialekt schreiben. Danke.



  • verzeihung. wusste nicht, dass ich so unverständlich schreibe.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten