2017-11-14 3 views
2

Ich arbeite an einem Legacy-Pro * C/C++ - Code und migrierte das Projekt zu Visual Studio 2015. Wenn ich den Code in VS kompiliere, gibt es mir eine unten Warnmeldung an mehr als 100 Orten.Die Warnmeldung loswerden - der richtige Weg

warning C4267: '=': conversion from 'size_t' to 'unsigned short', possible loss of data 

und der entsprechende Code ist

stmt.len = strlen((char*)stmt.arr); // VARCHAR stmt[500]; 

ich den obigen Code zu

stmt.len = static_cast<unsigned short>(strlen((char *)stmt.arr)); 

diesen Änderungen wurde die Planung wird nur die Warnmeldung entfernen. Aber ich muss an mehr als 100 Stellen modifizieren. Gibt es eine Möglichkeit, diese Warnmeldung loszuwerden, eine Art Makro zu verwenden? Bitte vorschlagen.

Dank

+2

@NJMR Wenn Sie dann nur das Datenelement stmt.len mit dem Typ size_t neu deklarieren können :) –

+0

Ändern Sie den Typ des 'len' Mitglieds? –

+0

Und C-artige Umwandlungen, wie Sie es mit '(char *) stmt.arr machen, sind normalerweise ein Zeichen, dass Sie etwas falsch machen. –

Antwort

3

Sie können die Warnung mit

#pragma warning(disable : 4267) 

obwohl ich persönlich arbeiten würde durch die Fehler und beheben off richtig schalten. Ihre Idee mit static_cast ist nicht schlecht, und es besteht keine Gefahr eines undefinierten Verhaltens mit Überlauf, da Sie unsigned Typen verwenden.

Abschließend ist zu beachten, dass die Verwendung eines Makros zum Ersetzen einer Standardbibliotheksfunktion undefiniertes Verhalten ist. Tu das nicht.

+0

Sie verdienen auch einen :) – oetoni

+0

Ha. Was werden die Bots sagen, als ich deine upvoted? – Bathsheba

+0

Aber ich muss an mehr als 100 Orten changen. Gibt es eine Möglichkeit, strlen mit einem Makro zu ersetzen, um unsigned short zurückzugeben? – NJMR

1

Es ist der richtige Weg size_t konsistent zu verwenden. Oder das Casting, das du als Update benutzt hast.

Eine Arbeit um für C4267 Warnungen und wie sie auch vorgeschlagen, here zu deaktivieren ist:

#pragma warning (disable : 4267) 

Für das Makro #define (nur ein Beispiel)

#include <iostream> 
#include <string.h> 
#define strlen(x) static_cast<unsigned short>(strlen((char *)x)) 
//I tested with ((char *)x+1) and ((char *)x+2) for variation 

using namespace std; 

int main() { 
    char stmt[] = "something"; 
    int len = strlen((char*)stmt); // VARCHAR stmt[500]; 
    cout << len; 
    return 0; 
} 

-Test here mit IDEONE

+1

FIxed einen Tippfehler in der Antwort. Ich hoffe, es hat dir nichts ausgemacht. – Bathsheba

+0

Nein, danke. Ich habe auch gesehen, dass du viel schneller geantwortet hast als ich: D – oetoni

+0

@oetoni: Also habe ich das hinzugefügt. #define strlen (x) static_cast (strlen ((char *) x)). Bitte korrigieren Sie mich, wenn ich falsch liege. – NJMR

Verwandte Themen