it-swarm.com.de

Sind typedef und #define in c gleich?

Ich frage mich, ob typedef und #define in c gleich sind.

106
hdn

Nein.

#define ist ein Präprozessor-Token: Der Compiler selbst wird es niemals sehen.
typedef ist ein Compiler-Token: Der Präprozessor kümmert sich nicht darum.

Sie können den einen oder den anderen verwenden, um denselben Effekt zu erzielen, aber es ist besser, den richtigen für Ihre Bedürfnisse zu verwenden

#define MY_TYPE int
typedef int My_Type;

Wenn die Dinge "haarig" werden, macht das richtige Werkzeug richtig

#define FX_TYPE void (*)(int)
typedef void (*stdfx)(int);

void fx_typ(stdfx fx); /* ok */
void fx_def(FX_TYPE fx); /* error */
106
pmg

typedef gehorcht Scoping-Regeln wie Variablen, wohingegen define bis zum Ende der Datei (oder bis zu einer übereinstimmenden undef) gültig bleibt.

Einige Dinge können auch mit typedef gemacht werden, die nicht mit define erledigt werden können.

Beispiele:

typedef int* int_p1;
int_p1 a, b, c;  // a, b, and c are all int pointers.

#define int_p2 int*
int_p2 a, b, c;  // only the first is a pointer!

.

typedef int a10[10];
a10 a, b, c; // create three 10-int arrays

.

typedef int (*func_p) (int);
func_p fp // func_p is a pointer to a function that
          // takes an int and returns an int
207
Andreas Grech

Nein, das ist nicht dasselbe. Zum Beispiel:

#define INTPTR int*
...
INTPTR a, b;

Nach der Vorverarbeitung erweitert sich diese Zeile auf

int* a, b;

Hoffentlich sehen Sie das Problem. Nur a hat den Typ int *; b wird als einfaches int deklariert (weil der * dem Deklarator und nicht dem Typbezeichner zugeordnet ist). 

Im Gegensatz dazu

typedef int *INTPTR;
...
INTPTR a, b;

In diesem Fall haben sowohl a als auch b den Typ int *

Es gibt ganze Klassen von Typedefs, die nicht mit einem Präprozessor-Makro emuliert werden können, z. B. Zeiger auf Funktionen oder Arrays:

typedef int (*CALLBACK)(void);
typedef int *(*(*OBNOXIOUSFUNC)(void))[20]; 
...
CALLBACK aCallbackFunc;        // aCallbackFunc is a pointer to a function 
                               // returning int
OBNOXIOUSFUNC anObnoxiousFunc; // anObnoxiousFunc is a pointer to a function
                               // returning a pointer to a 20-element array
                               // of pointers to int

Versuchen Sie das mit einem Präprozessor-Makro. 

21
John Bode

#define definiert Makros.
typedef definiert Typen.

Nun das sagen, hier sind ein paar Unterschiede:

Mit #define können Sie Konstanten definieren, die zur Kompilierzeit verwendet werden können. Die Konstanten können mit #ifdef verwendet werden, um zu überprüfen, wie der Code kompiliert wird, und bestimmten Code entsprechend den Kompilierungsparametern zu spezialisieren.
Sie können auch #define verwenden, um die Minisuchfunktionen Macro-Funktionen zu definieren.

typedef kann verwendet werden, um Typen Aliase zu geben (was Sie wahrscheinlich auch mit #define tun könnten), aber es ist sicherer, da #define -Konstanten suchen und ersetzen .
Außerdem können Sie die forward-Deklaration mit typedef verwenden, mit der Sie einen Typ angeben können, der verwendet werden soll, aber noch nicht mit der von Ihnen geschriebenen Datei verknüpft ist im.

12
Yochai Timmer

Präprozessor-Makros ("#define" s) sind ein lexikalisches Ersetzungswerkzeug, das "Suchen und Ersetzen" ist. Sie sind völlig unabhängig von der Programmiersprache und verstehen nicht, was Sie zu tun versuchen. Sie können sich sie als einen verklärten Copy/Paste-Mechanismus vorstellen - gelegentlich ist das nützlich, aber Sie sollten es mit Vorsicht verwenden.

Typedefs sind eine Funktion der C-Sprache, mit der Sie Aliase für Typen erstellen können. Dies ist äußerst nützlich, um komplizierte zusammengesetzte Typen (wie Struktur- und Funktionszeiger) lesbar und handhabbar zu machen (in C++ gibt es sogar Situationen, in denen Sie einen Typ von must typedef).

Für (3): Sie sollten Sprachfeatures immer den Präprozessor-Makros vorziehen, wenn dies möglich ist! Verwenden Sie also immer Typedefs für Typen und konstante Werte für Konstanten. Auf diese Weise kann der Compiler tatsächlich sinnvoll mit Ihnen interagieren. Denken Sie daran, dass der Compiler Ihr Freund ist, also sollten Sie es so viel wie möglich mitteilen. Präprozessor-Makros tun genau das Gegenteil, indem Sie Ihre Semantik vor dem Compiler ausblenden.

5
Kerrek SB

Sie sind sehr unterschiedlich, obwohl sie häufig verwendet werden, um benutzerdefinierte Datentypen zu implementieren (was ich davon ausgehe, dass es sich bei dieser Frage um alles handelt).

Wie von pmg erwähnt, wird #define vom Vorprozessor behandelt (wie eine Ausschneide- und Einfügeoperation), bevor der Compiler den Code sieht, und typedef wird vom Compiler interpretiert.

Einer der Hauptunterschiede (zumindest bei der Definition von Datentypen) besteht darin, dass typedef eine spezifischere Typüberprüfung zulässt. Zum Beispiel,

#define defType int
typedef int tdType

defType x;
tdType y;

Hier sieht der Compiler die Variable x als int, aber die Variable y als Datentyp 'tdType', der zufällig dieselbe Größe wie ein int hat. Wenn Sie eine Funktion geschrieben haben, die einen Parameter vom Typ defType verwendet hat, könnte der Aufrufer ein normales int übergeben und der Compiler würde den Unterschied nicht erkennen. Wenn die Funktion stattdessen einen Parameter vom Typ tdType verwendet, stellt der Compiler sicher, dass bei Funktionsaufrufen eine Variable des richtigen Typs verwendet wird.

Einige Debugger können auch mit typedefs umgehen, was sehr viel nützlicher sein kann, als alle benutzerdefinierten Typen als ihre zugrunde liegenden Primitivtypen auflisten zu lassen (wie es wäre, wenn stattdessen #define verwendet würde).

3
bta

Nein. 
typedef ist ein C-Schlüsselwort, das einen Alias ​​für einen Typ erstellt.
#define ist eine Vorverarbeitungsanweisung, die vor der Kompilierung ein Textersetzungsereignis erstellt. Wenn der Compiler auf den Code zugreift, ist das ursprüngliche Word "#defined" nicht mehr vorhanden. #define wird hauptsächlich für Makros und globale Konstanten verwendet.

2

AFAIK, Nr. 

Mit 'typedef' können Sie einen Alias ​​für einen vorhandenen Datentyp einrichten. Für zB typedef char chr; 

#define ist eine Präprozessor - Direktive, die zur Definition von Makros oder allgemeinen Mustersubsitutionen verwendet wird. Für zB #define MAX 100, ersetzt alle Vorkommnisse von MAX durch 100

1
user59634

Wie alle gesagt haben, sind sie nicht gleich. Die meisten Antworten geben an, dass typedef vorteilhafter ist als #define. Aber lassen Sie mich einen Pluspunkt von #define setzen:
wenn Ihr Code sehr groß ist und über viele Dateien verteilt ist, verwenden Sie #define; Es hilft bei der Lesbarkeit - Sie können einfach den gesamten Code vorverarbeiten, um die tatsächliche Typdefinition einer Variablen an der Stelle ihrer Deklaration selbst zu sehen.

0
abcoep