reinterpret_cast



  • simon.phoenix schrieb:

    Wollte eigentlich nur wissen, ob man die Warnung ignorieren kann 😃

    Nein.

    Mal 'ne andere Frage. Was sagt denn die SQL Doku zu der Funktion? Kann es sein, dass die Funktion vielmehr eine Referenz (nicht verwechseln mit &) auf den Wert erwartet? Also eher sowas

    reinterpret_cast<void*>(ein_string)
    reinterpret_cast<void*>(&ein_int)
    


  • Genau so mache ich das ja.

    Allerdings verstehe ich Folgendes nicht:

    reinterpret_cast<void*> (intvalue)
    

    - Keine Compilerwarnung
    - Funktion schlägt fehl (ungültiges Argument)

    reinterpret_cast<void*> (&intvalue)
    

    - Compilerwarnung
    - Funktion klappt einwandfrei

    Dokumentation schrieb:

    Depending on the value of Attribute, ValuePtr will be a 32-bit unsigned integer value or will point to a null-terminated character string.

    Danke für die Hilfe!



  • reinterpret_cast<void*> (&intvalue)
    

    Gibt bei mir keine Warnung.

    reinterpret_cast<void*> (intvalue)
    

    Gibt bei mir eine Warnung.

    Also genau umgekehrt wie du es sagst.
    Visual C++ 2003 .NET, 64-Bit Warnungen an.


  • Mod

    diese funktion hier?

    SQLRETURN SQLSetConnectAttr(
         SQLHDBC     ConnectionHandle,
         SQLINTEGER     Attribute,
         SQLPOINTER     ValuePtr,
         SQLINTEGER     StringLength);
    

    Ich vermute, du bekommst keine Probleme, wenn du statt int und void* gleich SQLPOINTER bzw. SQLUINTEGER verwendest; diese sollten bereits so definiert sein, dass die Umwandlung funktioniert. Deshalb gibt es sie ja.



  • simon.phoenix schrieb:

    reinterpret_cast<void*> (&intvalue)
    

    - Compilerwarnung

    Unwahrscheinlich. Bist du dir sicher, dass intvalue wirklich vom Typ int ist? Welchen Compiler hast du denn?
    Zudem war im ersten Beitrag davon die Rede, dass folgendes

    reinterpret_cast<void*>(intvalue)
    

    die Warnung verursacht.



  • Oh sorry, habe das verwechselt. Auf jeden Fall ist es so, dass das Funktionierende ( reinterpret_cast<void*>(intvalue) ) eine Warnung verursacht.

    camper schrieb:

    diese funktion hier?

    SQLRETURN SQLSetConnectAttr(
         SQLHDBC     ConnectionHandle,
         SQLINTEGER     Attribute,
         SQLPOINTER     ValuePtr,
         SQLINTEGER     StringLength);
    

    Ich vermute, du bekommst keine Probleme, wenn du statt int und void* gleich SQLPOINTER bzw. SQLUINTEGER verwendest; diese sollten bereits so definiert sein, dass die Umwandlung funktioniert. Deshalb gibt es sie ja.

    Genau das ist die Funktion.

    sqltypes.h schrieb:

    typedef unsigned long   SQLUINTEGER;
    // ...
    #define SQLULEN         SQLUINTEGER
    // ...
    typedef void* SQLPOINTER;
    // ...
    

    Ob void* oder SQLPOINTER ist somit egal. Und die Umwandlung mi SQLUINTEGER ist letztendlich die gleiche wie mi einem unsigned int.

    Ich will eigentlich nur einen int in void* ohne Warnung konvertieren :(.


  • Mod

    simon.phoenix schrieb:

    Ob void* oder SQLPOINTER ist somit egal. Und die Umwandlung mi SQLUINTEGER ist letztendlich die gleiche wie mi einem unsigned int.

    Ich will eigentlich nur einen int in void* ohne Warnung konvertieren :(.

    Das geht nicht - es sei denn, du deaktivierst diese spezielle warnung (ist ja eine 64bit warnung). Ich gehe aber davon aus, das in einer 64bit implementation (oder 32bit mit address extension, also far-pointern) die typedefs für SQLPOINTER/SQLUINTEGER anders aussehen (so dass es dann funktioniert) - DAS ist der grund, warum du sie benutzen solltest.



  • camper schrieb:

    Das geht nicht - es sei denn, du deaktivierst diese spezielle warnung (ist ja eine 64bit warnung). Ich gehe aber davon aus, das in einer 64bit implementation (oder 32bit mit address extension, also far-pointern) die typedefs für SQLPOINTER/SQLUINTEGER anders aussehen (so dass es dann funktioniert) - DAS ist der grund, warum du sie benutzen solltest.

    D.h. wäre es sehr dumm von mir in einem ODBC-API-WRAPPER diese Typen (auch SQLCHAR) etc nicht zu benutzen?


  • Mod

    genau. niemand verbietet dir nat., aus bequemlichkeit eigene typedefs zu benutzen, die auf diesen typen basieren. aber der schlechte stil, der sich hinter dieser kontextabhängigen interpretation des arguments als pointer oder integer verbirgt, ist nicht deine schuld und sollte möglichst auch nicht dein problem sein 🙂



  • simon.phoenix schrieb:

    Ob void* oder SQLPOINTER ist somit egal.

    Mit Abstrichen.

    simon.phoenix schrieb:

    Und die Umwandlung mi SQLUINTEGER ist letztendlich die gleiche wie mi einem unsigned int.

    Nicht ganz. 'unsigned long' ist immer noch was anderes als 'unsigned int'.



  • Ok, ich denke die Sache ist geklärt.

    Danke vielmals für eure Hilfe 👍


Anmelden zum Antworten