_Pragma не работает - PullRequest
       3

_Pragma не работает

2 голосов
/ 08 апреля 2011

Я пытаюсь использовать #pragma внутри #define.Я делаю что-то вроде этого:

// I assume this is a correct syntax. Please point out if it is wrong
#define COVERAGE(x)  _Pragma (Coverage_tool #x)

И затем внутри кода, который я использую как

COVERAGE(off) or COVERAGE(on). 

Здесь и далее есть строки.

Но когда я делаю это, я получаю ошибку компиляции, говорящую "expected ) near off".

Я также попытался "off" / "on" с кавычками (обычные строки). Но все еще та же ошибка.

Есть идеи, в чем проблема?

Ответы [ 2 ]

7 голосов
/ 08 апреля 2011

Я думаю, что строго говоря, Решение Lindydancer должно иметь форму:

#define COVERAGE(x) PRAGMA(Coverage_tool x)
#define PRAGMA(x) _Pragma(#x)

Это форма, используемая стандартом в примере, и она должна быть такойпуть, потому что _Pragma обработка оператора происходит в фазе перевода перед конкатенацией строкового литерала._Pragma определен таким образом, что он будет иметь дело только с удалением начальных и конечных кавычек при изготовлении соответствующих #pragma, а не любых других, которые взяты из конкатенации.

Однаковаш компилятор может быть терпим к другому подходу (GCC - нет).

Примечание: если для прагмы #pragma Coverage_tool нужны кавычки вокруг операнда on / off, то макрос COVERAGEдолжно быть:

#define COVERAGE(x) PRAGMA(Coverage_tool #x)

Примечание # 2: Если вы используете Microsoft C, я думаю, вы хотите:

#define COVERAGE(x) PRAGMA(Coverage_tool x)
#define PRAGMA(x) __pragma(x)

, потому что директива Microsoft написана немного по-другому и, что более раздражающе, не хочет получить кавычки, окружающие аргумент оператора.

Но Coverage_tool не является документированной прагмой, поддерживаемой MSVC, поэтому я думаю, что все еще отсутствует некоторая важная информация.

Поскольку у вас есть какой-то инструмент покрытия кода вне компилятора, который обрабатывает эту прагму, я думаю, вам нужно будет скрыть его от компилятора.Инструмент, вероятно, определит некоторое имя макроса, которое он распознает при обработке, которое не будет определено, когда компилятор выполняет свою работу.Например, lint определит макрос lint при его обработке, а компилятор ресурсов Microsoft определит RC_INVOKED.

Предположим, что ваш инструмент покрытия кода определяет COVERAGE_TOOL во время работы.Вы могли бы порадовать оба инструмента чем-то вроде:

#if COVERAGE_TOOL
#define COVERAGE(x) PRAGMA(Coverage_tool x)
#define PRAGMA(x) _Pragma(#x)
#else
#define COVERAGE(x)
#endif

Но я просто догадываюсь.Я ожидал бы, что документы для инструмента покрытия будут совершенно ясно о том, как эти директивы должны быть интегрированы в ваш код, если он поддерживает MSVC - вы должны посмотреть там детали (или спросить поставщика).

0 голосов
/ 19 августа 2011

Для Visual Studio 2005 ключевое слово __pragma недокументировано. Он задокументирован и доступен в Visual Studio 2008. Обратите внимание, что вам нужно два символа подчеркивания, и все они должны быть строчными.

Директивы Прагмы и ключевое слово __Pragma

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...