Есть ли способ встроить оператор прагмы в макрос с другими операторами?
Я пытаюсь добиться чего-то вроде:
#define DEFINE_DELETE_OBJECT(type) \
void delete_ ## type_(int handle); \
void delete_ ## type(int handle); \
#pragma weak delete_ ## type_ = delete_ ## type
Я согласен с решениями по усилению (за исключением волны), если они существуют.
c-preprocessor
pragma
stringification
Anycorn
источник
источник
Ответы:
Если вы используете c99 или c ++ 0x, есть оператор прагмы, используемый как
что эквивалентно
за исключением того, что его можно использовать в макросах (см. раздел 6.10.9 стандарта c99 или 16.9 окончательного проекта комитета по c ++ 0x)
Например,
когда положить в
gcc -E
даетисточник
__pragma()
оператор препроцессора, который, к сожалению, немного отличается от_Pragma()
оператора C99 (C99 принимает строковый литерал, MSVC принимает токены, которых нет в строке): msdn.microsoft.com/en-us/library/d9x1s805 .aspxОдна хорошая вещь, которую вы можете сделать с _Pragma ("аргумент"), - это использовать его для решения некоторых проблем компилятора, таких как
источник
Нет, портативного способа сделать это нет. Опять же, нет никаких переносимых способов использования #pragma. Из-за этого многие компиляторы C / C ++ определяют свои собственные методы для выполнения вещей, подобных прагме, и они часто могут быть встроены в макросы, но вам необходимо другое определение макроса для каждого компилятора. Если вы хотите пойти по этому пути, вы часто делаете что-то вроде этого:
Если это не очевидно, вы хотите определить
Weak_b
иWeak_e
, как начать-и-конец брекет конструкции , потому что некоторые компиляторы , как GCC добавить атрибуты в качестве дополнения к типу подписи, а некоторые, как MSC добавить его в качестве префикса (или , по крайней мере , он сделал однажды я уже много лет не использовал MSC). Заключение в скобки конструкций позволяет вам определять то, что всегда работает, даже если вам нужно передать всю сигнатуру типа в конструкцию компилятора.Конечно, если вы попытаетесь перенести это в компилятор без нужных вам атрибутов, вы ничего не сможете сделать, кроме как оставить макросы развернутыми до нуля и надеяться, что ваш код все еще будет работать. В случае чисто предупреждающих или оптимизирующих прагм это вполне вероятно. В остальных случаях не так много.
О, и я подозреваю, что вам действительно нужно определить Weak_b и Weak_e как макросы, которые принимают параметры, но я не хотел читать документы о том, как создать слабое определение только для этого примера. Я оставляю это читателю в качестве упражнения.
источник
Нет, вы не можете помещать операторы препроцессора в операторы препроцессора. Однако вы можете поместить его в
inline
функцию. Однако это побеждаетC
метку.источник
inline
, и большинство основных реализаций C89 имеют некоторые вариации.inline
еще одна вещь, которую C позаимствовал из C ++!:)