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:
#if defined(COMPILER_GCC)
#define Weak_b
#define Weak_e __attribute__((weak))
#elif defined(COMPILER_FOO)
#define Weak_b __Is_Weak
#define Weak_e
#endif
#define DEFINE_DELETE_OBJECT(type) \
Weak_b void delete_ ## type_(int handle) Weak_e; \
Weak_b void delete_ ## type(int handle) Weak_e;
Für den Fall , es ist nicht klar , wollen Sie definieren Weak_b
und Weak_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.