2015-09-02 12 views
6

Nach cplusplus.com, die Syntax eines Makros zu definieren ist:Präprozessormakro ersatzlos C++

#define identifier replacement 

Allerdings habe ich manchmal auf einer Makrodefinition stolpern, die keinen Ersatz enthält. Zum Beispiel in afxwin.h gibt es die folgende Präprozessordefinition:

#define afx_msg   // intentional placeholder 

Meine Fragen:

  1. Was zur Compile-Zeit passiert, wenn eine Präprozessordefinition, die keinen Ersatz verwendet hat? Wird es einfach ignoriert? Zum Beispiel, wird die Linie afx_msg void OnAddButton();void OnAddButton();?
  2. Was ist der Zweck der Verwendung von Präprozessor ohne Ersatz? Ist es einfach, den Code klarer zu machen?
+4

Wenn Sie es ausprobiert haben, haben Sie Weizen entdeckt? –

+0

Sie können sich einfach '# define' als einfache Such- und Ersetzungsfunktion vorstellen, die vor der Kompilierung angewendet wurde. Versuchen Sie einfach, afx_msg zu suchen und ersetzen Sie sie durch nichts. – Catalin

Antwort

10

"Nichts" (kein Text) ist ein gültiger Ersatztext für ein Makro. Es wird einfach durch den Präprozessor entfernt (genauer gesagt, durch nichts ersetzt).

Es gibt mehrere Gründe, warum Sie so etwas verwenden sollten. Eine besteht darin, einfach das Makro in #ifdef und ähnlichen Konstruktoren zu verwenden.

Eine andere ist bedingte Kompilierung. Ein typischer Anwendungsfall sind öffentliche APIs und DLL-Exporte. Unter Windows müssen Sie eine Funktion als aus einer DLL exportiert (beim Erstellen der DLL) oder als aus einer DLL importiert markieren (beim Verknüpfen mit der DLL). Auf ELF-Systemen sind solche Erklärungen nicht erforderlich.Daher wird häufig Code in Öffentliche Bibliotheksheader wie folgt angezeigt:

Ein weiterer Grund könnte Codeverarbeitungs-Tools sein. Vielleicht haben Sie ein Werkzeug, das Quellcode analysiert und eine Liste von Funktionen mit einem bestimmten Marker extrahiert. Sie können einen solchen Marker als leeres Makro definieren.

1
  1. der Präprozessor verarbeitet sie, es zu entfernen und ersetzt sie durch nichts
  2. eine Vielzahl von Gründen sein könnten, einschließlich Lesbarkeit, Portabilität, benutzerdefinierte Compiler Funktionen usw.
3
#define bla 

definiert einfach bla.

Sie es mit

#ifdef bla 
... 
place some code here 
... 
#endif 

ein typischen Teilen im Debug-Modus spezielle Code Anwendungsfall ist #define DEBUG zu ermöglichen, verwendet werden.

Eine andere Möglichkeit, solche Dinge von „außen“ zu setzen:

g++ -DDEBUG x.cpp 

die auch das Makro DEBUG setzt definiert.

Und sollte jeder Header-Datei wie etwas haben:

#ifndef THIS_HEADER_INCLUDE_GUARD 
#define THIS_HEADER_INCLUDE_GUARD 
... 
rest of header file 
... 
#endif 

Dieses einfach Ihre Header-Datei für (rekursiv) schützt lesen die einmal mehr.

Einige können mit implementierungsspezifischen #pragma once durchgeführt werden.

Verwandte Themen