2016-06-29 7 views
0

Ich benutze Rapidjson, die eine all-Header-Bibliothek ist. In rapidjson.h gibt es ein Makro RAPIDJSON_ASSERT, in einer meiner CPP-Dateien, würde ich es neu zu definieren mag, so habe ich diesen Code an der Spitze meiner Datei:Kann eine Makroredefinition auf einzelne cpp-Datei angewendet werden?

#include "stdafx.h" // for windows 
#pragma push_macro("RAPIDJSON_ASSERT") 
#define RAPIDJSON_ASSERT(x) if(!(x)) throw std::logic_error("rapidjson exception"); 

#include "rapidjson/rapidjson.h" 
#include "rapidjson/document.h" 
#include "rapidjson/stringbuffer.h" 
#include "rapidjson/writer.h" 

.... 
.... 
#pragma pop_macro("RAPIDJSON_ASSERT") 

Hier ist die whay dass rapidjson.h definiert RAPIDJSON_ASSERT :

#ifndef RAPIDJSON_ASSERT 
#include <cassert> 
#define RAPIDJSON_ASSERT(x) assert(x) 
#endif // RAPIDJSON_ASSERT 

In der Dokumentation, die die RAPIDJSON_ASSERT Logik außer Kraft zu setzen, müssen Sie nur RAPIDJSON_ASSERT definieren, bevor Sie eine der Dateien enthalten.

Das Problem ist, dass, wenn ich den Code im Debugger ausführen, RAPIDJSON_ASSERT nicht neu definiert wird. Ich überprüft stdafx.h für alles, was die Rapidjson Header-Dateien enthalten würde, und es gibt nichts.

Ich war unter der Annahme, dass jede Kompilierungseinheit durch die Header-Dateien laufen sollte.

Beachten Sie, dass wenn ich die Neudefinition des Makros in stdafx.h verschiebe ich das Makro neu definiert, aber ich hatte gehofft, es pro Kompilierungseinheit zu tun.

+1

mit neu zu definieren, haben Sie umfassen in stdafx.h rapidjson? – jaggedSpire

+0

Das Muster scheint falsch zu sein. Möchten Sie das Makro innerhalb von rapidjson für diese Übersetzungseinheit oder einfach in Ihrer Übersetzungseinheit ändern? Wenn letzteres, setze das redefine nach den Rapidjson-Headern. Sonst könnte Rapidjson das Makro selbst einfach neu definieren. – KABoissonneault

+0

@jaggedSpire - Ich habe rapidjson.h nicht in stdafx.h eingeschlossen, also bin ich mir nicht sicher, warum es das Makro nicht überschreibt. – bpeikes

Antwort

1

Es scheint, wie Sie die Definition von RAPIDJSON_ASSERT für den rapidjson Code selbst

Wenn so ändern möchten, müssen Sie ein #define nach dem Ort hinzufügen, wo sie definiert ist. Sofern Sie die rapidjson.h Datei, die einzige Alternative bearbeiten möchten, dies zu tun:

#include "stdafx.h" // for windows 

// One would assume that the macro gets defined somewhere inside here 
#include "rapidjson/rapidjson.h" 

// Compiler will complain about macro redefinition without this #undef 
#undef RAPIDJSON_ASSERT  
#define RAPIDJSON_ASSERT(x) if(!(x)) throw std::logic_error("rapidjson exception"); 

#include "rapidjson/document.h" 
#include "rapidjson/stringbuffer.h" 
#include "rapidjson/writer.h" 

Nun ist die Definition von RAPIDJSON_ASSERT wird für den Rest der Header-Dateien geändert. Sie brauchen nicht die push_macro und pop_macro Spielereien - Makros sind nur gültig für jede Einheit

Hinweis, dass es nicht eine gute Sache Dinge für Bibliotheken #define

+0

Ich habe einige Informationen in die Frage eingefügt, aber die Dokumente geben an, dass Sie RAPIDJSON_ASSERT vor dem Einschließen der Datei definieren sollten, nicht danach. Was nicht sinnvoll ist, ist, dass die #ifndef-Anweisung rapidjson.h anscheinend nur einmal über alle Kompilierungseinheiten hinweg überprüft wird. – bpeikes

+1

Vorkompilierte Header komplett ausschalten und versuchen? –

+0

Ich dachte, dass vorkompilierte Header das Problem sein könnten. Ich werde es versuchen. – bpeikes

Verwandte Themen