In unserem großen Erbe app mit g ++ neu zu kompilieren 4.8.2 (32-Bit-std = C++ 98), tauchte eine neue Warnung von einem Teil der Daten Serializer warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
C++ Verweis auf C-String ist möglich?
Der Code ohne Warnung auf g zusammengestellt sagen aus ++ 4.4 .7.
Die Warnung kommt von einer Vorlagenfunktion, die ein "char &" serialisiert, wo die Kommentare sagen, dass es sich um eine Referenz auf eine nullterminierte Zeichenfolge handelt.
Ich bin neu in C++ ... ist nicht const char&
ein Verweis auf ein einzelnes Zeichen? Und würde diese Referenz nicht als Startadresse einer C-Null-terminierten Zeichenkette eine Art von Cheat sein?
Ignoriere ich die Warnung oder sonstwie, welche Form (falls vorhanden) für dieses Konstrukt?
//! Implementations of write() for null-terminated strings.
void write(DvCsr::TName, const char* v, long = NO_INDEX) {writeCStr(v);}
void write(DvCsr::TName, const u_char* v, long = NO_INDEX) {writeCStr(v);}
void write(DvCsr::TName, const char& v, long = NO_INDEX) {writeRefCStr(v);}
void write(DvCsr::TName, const u_char& v, long = NO_INDEX) {writeRefCStr(v);}
//! Write null-terminated string data types to the stream.
template <class T>
void writeCStr(const T* start)
{
// Find length of the string, not including null terminator,
// and size (in bytes), including null terminator.
const T* end = start;
while (*end++)
;
size_t len = end - start;
// Add the string to the end of the buffer.
mBuffer.reserve(mBuffer.size() + len);
std::copy(start, start + len, std::back_inserter(mBuffer));
};
template <class T>
void writeRefCStr(const T &start)
{
writeCStr((unsigned char *)start);
}
Gute Faustregel: Warnungen nie ignorieren und immer mit '-pedantic -Wall' kompilieren – Rakete1111
@ Rakete1111 Ich würde' -Wextra' hinzufügen (als Minimum). –
@JesperJuhl In diesem Fall würde ich auch '-pedantic-errors -Werror' hinzufügen: P – Rakete1111