2012-04-04 18 views

Antwort

2

Sie können das Makro in die .c-Datei einfügen, wo es anstelle einer Headerdatei verwendet werden soll, und es ist nicht von anderen Dateien aus zugänglich (obwohl einige Compiler die Aufnahme von .c-Dateien zulassen, aber niemand das, na ja, niemand ist vernünftig.

Auch unten erwähnt ist die Verwendung von #undef, aber das kann schnell beginnen, chaotisch zu werden, wenn Sie dieses Makro viel verwenden.

+2

Nun, * jeder * Compiler ermöglicht die Aufnahme von. C-Dateien. Und viele Leute machen es, weil es manchmal * vernünftig ist. Ihre grundsätzliche Antwort darauf, sie per Übersetzungseinheit einzuschränken, erscheint sinnvoll. –

+0

@CarlNorum Nun, einige Leute benutzen StyleCop oder FxCop, wo Sie zumindest in der Industrie einen Compilerfehler verursachen können. Ich habe nie wirklich an ein Szenario gedacht, in dem die Angabe einer .c-Datei möglich war oder nicht in eine .h-Datei mit freigelegten Prototypen aufgenommen werden konnte. –

+1

Keines dieser Tools hat etwas mit C zu tun, oder? Und sie sind sicherlich keine Compiler. –

2

Makros werden vom Vorprozessor erstellt. Der Preprozessor liest alle zu verarbeitenden Dateien und wendet Makros und Makrologik an, deren Ergebnisse dann an den Compiler übergeben werden.

Sobald ein Makro definiert ist, wird sein Wert verwendet überall das Makro wird referenziert, auch in anderen Dateien.

Einzelheiten zur Verwendung von Makros finden Sie unter the GCC Documentation.

3

Die allgemeine Praxis ist #undef das Makro, wenn Sie damit fertig sind. Fehler anfällig, aber es funktioniert.

Makros haben keinen Blockbereich.

2

Alle Makros sind bereits wie statische Funktionen, da sie nur in der Übersetzungseinheit verwendet werden können, in der sie definiert sind. Wenn Sie die Bereiche, in denen Sie ein bestimmtes Makro verwenden können, einschränken möchten, definieren Sie es einfach an einem sinnvollen Ort.

0

ein Makro wird vom Präprozessor ausgewertet, nicht vom Compiler. Es weiß nichts über Kompilierungseinheiten, Sie können es also nicht auf einen beschränken. wird stattdessen innerhalb der Übersetzungseinheit ausgewertet.

Der Lebenszyklus des Makros beginnt in der Zeile, in der er definiert ist (alle darüber liegenden Zeilen wissen nichts über das Makro), und endet entweder am Ende der Übersetzungseinheit oder bei Undefiniertheit mit "#undef"

0

Alle C-Makros sind auf die Übersetzungseinheit (eine einzelne C-Datei) beschränkt, sofern sie nicht in einer Kopfzeile definiert sind und in jeder Übersetzungseinheit enthalten sind.

Leider ist eine Übersetzungseinheit oft groß, leicht Hunderte bis Tausende von Zeilen Code, und Makros sind kontextabhängig und es wäre viel nützlicher, wenn es auf viel kleineren Kontext (wie einen Blockbereich) beschränkt werden könnte . Der fehlende Geltungsbereich begrenzt die Makroverwendung in C, hauptsächlich globale Konstanten, ein paar universelle einfache Routinen und benötigt oft alle Großbuchstaben oder einen Trick, um Verschmutzungen zu verwalten.

Funktionen höherer Ordnung können jedoch leicht mit Makros erreicht werden. Denken Sie darüber nach, wie wir natürliche Sprache verwenden, wobei wir "es" verwenden können, um etwas zu bezeichnen, das zu lange ist, um es im Kontext zu wiederholen. Ein Scoped-Makro-System aktiviert die gleiche Fähigkeit.

Ich habe MyDef entwickelt, die im Wesentlichen ein Makro-System ist.

Verwandte Themen