Нет, нет портативного способа сделать это.Опять же, нет никаких переносимых способов использовать #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 как макросы, которые принимают параметры, но я не хотел читать документы о том, как создатьслабое определение только для этого примера.Я оставляю это как упражнение для читателя.