Вопрос

Есть ли способ встроить заявление Pragma в макросе с другими заявлениями?

Я пытаюсь достичь чего-то вроде:

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

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

Это было полезно?

Решение

Если вы используете C99 или C ++ 0x, есть оператор Pragma, используемый как

_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
 ;

Другие советы

Одна хорошая вещь, которую вы можете сделать с _pragma («аргумент»), используют его для решения некоторых вопросов компилятора, такими как

#ifdef _MSC_VER
#define DUMMY_PRAGMA _Pragma("argument")
#else
#define DUMMY_PRAGMA _Pragma("alt argument")
#endif

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

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

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

Есть ли способ встроить заявление Pragma в макросе с другими заявлениями?

Нет, вы не можете положить препроцессовые заявления в препроцессорные заявления. Вы могли бы, однако, положить его в inline функция. Что побеждает C тег, хотя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top