Я думаю, что строго говоря, Решение 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 - вы должны посмотреть там детали (или спросить поставщика).