2016-05-09 14 views
0

Ich habe eine C++ - Codebasis, die auf zwei Plattformen kompiliert, eine davon Visual C++ 2013. Die zweite Plattform unterstützt C++ 03 (und nicht C++ 11) . Die enum size-Implementierung im Compiler der zweiten Plattform verwendet die minimal benötigte Größe. VC++ - Implementierung verwendet 4 Bytes, auch wenn sie nicht benötigt werden.Verwenden von VC++ - Compiler-Flags zum Angeben der Enum-Größe

Ich möchte VC++ kompilieren die Enums als minimale Größe, ohne den Code zu ändern. Der andere Compiler beispielsweise kompiliert das nicht:

enum MyEnum : unsigned char {}; 

Ich suchte, konnte aber Compilerflags nicht finden, um dies zu unterstützen. Existieren sie?

+0

Dieses schreckliche Idee hat ganz über ihn geschrieben. –

+1

@CaptainObvlious Ich kann mir vorstellen, wie Sie ohne den Kontext, die Anforderungen oder die Rationalität zu verstehen, dass Sie genug Daten haben, um das zu schließen. Was hat das mit der Qualität der Frage selbst zu tun? – Asaf

+0

Ja, ich kann daraus schließen, dass dies das Potenzial hat, eine ganze Reihe von Dingen zu brechen. Das Ändern der Größe der "Aufzählung" in einem globalen Bereich wirkt sich auf alles aus. Dies bedeutet, dass die Definition der'Enum'-Änderungen zwischen dem, was Ihr Code erwartet, und dem ursprünglichen Code erwartet wird. Wenn Sie gegen Quellcode bauen, sind die Probleme weniger offensichtlich, wenn Sie einfach nur schlechte Dinge mit der Bibliothek verbinden. Wenn eine Größe erwartet wird, wird wahrscheinlich jeder Code, der darauf angewiesen ist, kaputt gehen. Erwarten Sie, die Verwendung von _all_ 'enum' Typen zu überprüfen, und überprüfen Sie jedes Mal, wenn Sie auf neuere Bibliotheken aktualisieren. –

Antwort

2

C 03 ++ müssen expliziten Typen für Enum-Konstanten verstehen:

enum Enumeration 
#if __cplusplus >= 201103L 
    : unsigned char 
#endif 
{ 
    ONE = unsigned char(1), // storage type for enum is unsigned char 
    ... 
} 
+0

Danke. Ich möchte jedoch vermeiden, explizit für jede Aufzählung ihren erforderlichen Typ anzugeben, sowohl wegen der zusätzlichen Arbeit als auch der möglichen Fehler - wenn ich einen großen Wert zu einer Aufzählung hinzufüge, kann sie brechen. – Asaf

+0

Dies ist ein sehr guter Vorschlag, obwohl Sie etwas wie '#define ENUM_SIZE: unsigned char' und dann' enum Enumeration ENUM_SIZE {}; ' –

Verwandte Themen