2016-04-09 8 views
0

Welche dieser Methoden ist sicherer für die Definition von Variablentypen? Ich weiß, dass wir alle die Stirn runzeln, wenn wir #defines sehen, aber es scheint genau so gut zu funktionieren wie typedef hier:Korrekte Art, Typ zu definieren (typedef vs #define)

Gibt es einen Vorteil auf die eine oder andere Weise, und wenn ja, was könnte es sein?

Methode eins:

#include <iostream> 

    #define byte unsigned char 

    int main() { 
     byte testByte = 'A'; 
     std::cout << testByte << std::endl; 

     return 0; 
    } 

Methode zwei:

 #include <iostream> 

    int main() { 
     typedef unsigned char byte; 

     byte testByte = 'A'; 
     std::cout << testByte << std::endl; 

     return 0; 
    } 
+0

Was bedeutet "sicherer"? –

+6

Ihre Methode 1 ist eine schreckliche Übung. –

+1

Wenn möglich, bevorzugen Sie die aktuellen Sprachfunktionen über Präprozessorfunktionen. Mit anderen Worten, vermeiden Sie Makros. – Logicrat

Antwort

8

Sie immer die 2. ein (das heißt typedef oder using) verwenden sollten.

Versuchen Sie nicht, Makros in C++ so weit wie möglich zu verwenden, und die meisten Fälle könnten vermieden werden. Sie sind nur Textersetzung vor dem Kompilieren und mehr "gefährlich". z.B.

#define byte_pointer unsigned char* 
byte_pointer p, q; // only p is a pointer 
+2

Großartig! Danke für die Antwort –

+0

Ich sollte auch erwähnen, dass Sie eine separate Kopfzeile mit diesen 'using' oder' typedef' Deklarationen definieren sollten, es wird nicht nur alles auf eine einzelne Datei beschränken, sondern Sie können auch Werte in nur einer ändern ein Platz. –

1

#define Verwendung ist nicht sicher (siehe andere Antwort) Mit typedef der üblicher Weg ist Typen Aliase zu definieren.

Es gibt auch die neue "mit" Syntax

using MyByte = unsigned char; 

diese Antwort auf eine Frage im Zusammenhang sehen (typedef vs. verwenden) https://stackoverflow.com/a/10748056/446303

0

Gehen Sie mit dem typedef. Es gibt viele Gründe, aber die erste, die in den Sinn kommt, ist, dass die typedef gilt für den Bereich, in dem es erklärt wird, aber die #define ignoriert Geltungsbereich und gilt für den Rest der Quellmodul, in dem es definiert ist. Aus diesem Grund allein, Die typedef ist "sicherer".

1

Nur eines Ihrer Beispiele ist tatsächlich eine Möglichkeit, einen Typ zu definieren, also gibt es keinen Wettbewerb zwischen ihnen.


#define byte unsigned char 

Dies macht nur alle Äußerungen von byte in Ihrem Code mit unsigned char ersetzt bekommen vor dem Kompilieren beginnt. Es definiert keinen Typ.

Die Deklaration wird int unsigned char; werden, was Unsinn ist.


typedef unsigned char byte; 

Dies definiert einen Typ. Der Typ unterliegt Syntaxregeln, Scoping-Regeln und all diesen schönen Dingen.

Die Deklaration wird immer noch die Deklaration sein, weil byte hier im Raum für einen Variablennamen gefunden wird.


using byte = unsigned char; 

Dies ist die „moderne“ Art und Weise eine Art Alias, die viele klarere Syntax als eine (vor allem für komplexere Typen) typedef Aussage hat zu definieren.

Es wurde eingeführt, weil sonst die neue Syntax für Vorlage Typ Aliases fast unmöglich gewesen wäre, vernünftig zu machen.

+0

Schön und klar, so ^ – sjsam

Verwandte Themen