Прагма в определяет макрос

Там некоторый путь состоит в том, чтобы встроить оператор прагмы в макрос с другими операторами?

Я пытаюсь достигнуть чего-то как:

#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type_(int handle);                  \
    void delete_ ## type(int handle);                                                \
    #pragma weak delete_ ## type_ = delete_ ## type

Я хорошо с решениями для повышения (сохраните для волны), если Вы существуете.

94
задан Brian Tompsett - 汤莱恩 25 February 2016 в 10:36
поделиться

3 ответа

Если вы используете c99 или c ++ 0x, существует оператор прагмы, используемый как

_Pragma("argument")

, который эквивалентен

#pragma argument

, за исключением того, что его можно использовать в макросах (см. Раздел 6.10.9 стандарта c99, или 16.9 окончательного проекта комитета по c ++ 0x)

Например,

#define STRINGIFY(a) #a
#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type ## _(int handle);                  \
    void delete_ ## type(int handle);                   \
    _Pragma( STRINGIFY( weak delete_ ## type ## _ = delete_ ## type) )
DEFINE_DELETE_OBJECT(foo);

при помещении в gcc -E дает

void delete_foo_(int handle); void delete_foo(int handle);
#pragma weak delete_foo_ = delete_foo
 ;
108
ответ дан 24 November 2019 в 06:09
поделиться

Нет, портативного способа сделать это нет. Опять же, нет никаких переносимых способов использования #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 как begin-and- Конечные конструкции скобок, потому что некоторые компиляторы, такие как GCC, добавляют атрибуты в качестве дополнения к сигнатуре типа, а некоторые, например, MSC, добавляют их в качестве префикса (или, по крайней мере, так было однажды, с тех пор как я использовал MSC, прошли годы). Заключение в скобки конструкций позволяет вам определять то, что всегда работает, даже если вам нужно передать всю сигнатуру типа в конструкцию компилятора.

Конечно, если вы попытаетесь перенести это на компилятор без нужных вам атрибутов, вы ничего не сможете сделать, кроме как оставить макросы развернутыми до нуля и надеяться, что ваш код все еще будет работать. В случае чисто предупреждающих или оптимизирующих прагм это вполне вероятно. В остальных случаях не так уж и много.

О, и я подозреваю, что вам действительно нужно определить Weak_b и Weak_e как макросы, которые принимают параметры, но я не хотел читать документацию о том, как создать слабое определение только для этого примера. Я оставляю это в качестве упражнения для читателя.

0
ответ дан 24 November 2019 в 06:09
поделиться

Есть ли способ встроить оператор прагмы в макрос с другими операторами?

Нет, вы не можете помещать операторы препроцессора в операторы препроцессора. Однако вы можете поместить его во встроенную функцию . Однако это побеждает тег C .

-3
ответ дан 24 November 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: