我想在#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"
引号(常规字符串)。但仍然是同样的错误。
知道这是什么问题吗?
答案 0 :(得分:7)
我认为严格来说,Lindydancer's solution必须符合以下形式:
#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)
因为微软的指令拼写略有不同,而且更令人讨厌的是,不希望想要引用操作符的参数。
但是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,这些指令如何需要集成到您的代码中 - 您应该查看详细信息(或询问供应商)。
答案 1 :(得分:0)
对于Visual Studio 2005,__pragma
关键字未记录。它已在Visual Studio 2008中记录并可用。请注意,您需要两个下划线字符,它们全部为小写。