Ні, немає портативного способу зробити це. Знову ж таки, портативних способів використання #pragma взагалі немає. Через це багато компіляторів C / C ++ визначають свої власні способи робити речі, подібні до прагми, і вони часто можуть бути вбудовані в макроси, але для кожного компілятора потрібне інше визначення макросу. Якщо ви готові пройти цей маршрут, ви часто робите такі речі:
#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;
У випадку, якщо це не очевидно, ви хочете визначити Weak_b
і Weak_e
як конструкти брекетування з початком і в кінці, оскільки деякі компілятори, такі як GCC, додають атрибути як доповнення до підпису типу, а деякі, як MSC, додають його як префікс (або принаймні це робив колись минуло років, як я використовував MSC). Наявність брекет-контрактів дозволяє визначити щось, що завжди працює, навіть якщо вам доведеться передати підпис всього типу в конструкцію компілятора.
Звичайно, якщо ви спробуєте перенести це до компілятора без потрібних атрибутів, ви нічого не можете зробити, окрім як залишити макроси розгорнутись ні до чого, і сподіваюся, що ваш код все ще працює. У випадку чистого попередження або оптимізації прагм це ймовірно. В інших випадках не так вже й багато.
О, і я підозрюю, що вам потрібно було б визначити Weak_b та Weak_e як макроси, які приймають параметри, але я не хотів читати документи, як створити слабке визначення саме для цього прикладу. Я залишаю це як вправу для читача.