_Pragma无法正常工作

时间:2011-04-07 21:05:09

标签: c

我想在#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 个答案:

答案 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中记录并可用。请注意,您需要两个下划线字符,它们全部为小写。

Pragma Directives and the __Pragma Keyword