Gibt es eine Möglichkeit, Pragma-Anweisungen mit anderen Anweisungen in Makros einzubetten?
Ich versuche etwas zu erreichen wie:
#define DEFINE_DELETE_OBJECT(type) \
void delete_ ## type_(int handle); \
void delete_ ## type(int handle); \
#pragma weak delete_ ## type_ = delete_ ## type
Ich bin mit Boost-Lösungen (außer Wave) einverstanden, wenn es eine gibt.
c-preprocessor
pragma
stringification
Anycorn
quelle
quelle
Antworten:
Wenn Sie c99 oder c ++ 0x verwenden, gibt es den Pragma-Operator, der als verwendet wird
das ist äquivalent zu
außer es kann in Makros verwendet werden (siehe Abschnitt 6.10.9 des c99-Standards oder 16.9 des endgültigen Ausschussentwurfs von c ++ 0x)
Beispielsweise,
wenn in
gcc -E
gibtquelle
__pragma()
Präprozessor-Operator, der sich leider geringfügig vom_Pragma()
Operator von C99 unterscheidet (C99 verwendet ein Zeichenfolgenliteral, MSVCs verwendet Token, die nicht in einer Zeichenfolge enthalten sind): msdn.microsoft.com/en-us/library/d9x1s805 .aspxEine nette Sache, die Sie mit _Pragma ("Argument") tun können, ist es, um einige Compilerprobleme wie z
quelle
Nein, dafür gibt es keine tragbare Möglichkeit. Andererseits gibt es überhaupt keine tragbaren Möglichkeiten, #pragma zu verwenden. Aus diesem Grund definieren viele C / C ++ - Compiler ihre eigenen Methoden, um pragmaähnliche Dinge auszuführen, und sie können häufig in Makros eingebettet werden. Sie benötigen jedoch für jeden Compiler eine andere Makrodefinition. Wenn Sie bereit sind, diesen Weg zu gehen, machen Sie oft solche Dinge:
Für den Fall , es ist nicht klar , wollen Sie definieren
Weak_b
undWeak_e
wie beginnen-und-End - Konstrukte Bracketing weil einige Compiler wie GCC die Attribute als Zusatz zu einer Art Signatur hinzuzufügen, und einige, wie MSC fügen Sie es als Präfix (oder zumindest tat es Es ist Jahre her, seit ich MSC verwendet habe. Mit Klammerkonstruktionen können Sie etwas definieren, das immer funktioniert, auch wenn Sie die gesamte Typensignatur an ein Compilerkonstrukt übergeben müssen.Wenn Sie versuchen, dies auf einen Compiler ohne die gewünschten Attribute zu portieren, können Sie natürlich nichts anderes tun, als die Makros auf nichts erweitern zu lassen und hoffen, dass Ihr Code weiterhin ausgeführt wird. Im Falle einer reinen Warnung oder Optimierung von Pragmas ist dies wahrscheinlich. In anderen Fällen nicht so sehr.
Oh, und ich vermute, Sie müssten Weak_b und Weak_e tatsächlich als Makros definieren, die Parameter annehmen, aber ich war nicht bereit, die Dokumente zu lesen, um eine schwache Definition nur für dieses Beispiel zu erstellen. Ich überlasse das dem Leser als Übung.
quelle
Nein, Sie können Präprozessoranweisungen nicht in Präprozessoranweisungen einfügen. Sie können es jedoch in eine
inline
Funktion einfügen. Das besiegt dasC
Tag jedoch.quelle
inline
und die meisten großen C89-Implementierungen haben einige Variationen.inline
ist noch eine andere Sache, die C von C ++ entlehnt hat!:)