2017-03-01 1 views
1

Ich habe ein Problem mit einem in meinem C-Code definieren: für Tests Zweck, ich brauche vsnprintf-_tests_vsnprintf während der Kompilierung zu definieren, wie:MSVC 1900 und definiert vsnprintf

gcc -Dvsnprintf=_tests_vsnprintf file.c 

Diese erlauben Sie mir einen Fehler zurückzugeben von ein vsnpintf Aufruf, um das Fehlermanagement in meiner App zu testen. Es funktioniert gut unter Linux, aber baut nicht auf Windows auf, MSVC 1900 (Visual Studio 2015) beschwert sich über Makroredefinition (C1189).

Der Fehler von diesem Code kam in stdio.h:

#if defined vsnprintf 
     ... 
    #error Macro definition of vsnprintf conflicts with Standard Library function declaration 
    #endif 

Ich weiß nicht, wie man mit der minimalen Anzahl von Änderungen des Fehlers loszuwerden.

Können Sie mir helfen?

+0

Die Definition von Namen der Standardbibliothek ruft undefiniertes Verhalten auf. Sie sind für die Implementierung reserviert. So beginnen Namen mit Unterstrich auf Dateiebene. Kurz gesagt: Sie dürfen dies nicht tun und gcc "essen" ist nur zufällig (es ist jedoch nicht garantiert, dass Sie so arbeiten, wie Sie es erwarten). – Olaf

Antwort

1

Der Code in VC-Header verhindert, dass Sie speziell aus dies zu tun:

#if defined vsnprintf 
    // This definition of vsnprintf will generate "warning C4005: 'vsnprintf': macro 
    // redefinition" with a subsequent line indicating where the previous definition 
    // of vsnprintf was. This makes it easier to find where vsnprintf was defined. 
    #pragma warning(push, 1) 
    #pragma warning(1: 4005) 
    #define vsnprintf Do not define vsnprintf as a macro 
    #pragma warning(pop) 
    #error Macro definition of vsnprintf conflicts with Standard Library function declaration 
#endif 

Wie @Olaf erwähnt, können Sie in Probleme mit Bibliothek Code ausführen können, wenn Sie Standard-Funktion neu zu definieren. Wenn Sie dies jedoch nur auf Ihren Code beschränken und sicherstellen, dass keine neue Definition von den Standardheadern übernommen wird, sollten Sie #define vsnprintfnach eingeben können, die Sie eingeschlossen haben <stdio.h>.

#include <stdio.h> 
#define vsnptrintf my_test_vsnprintf