我正在尝试在#define中使用#pragma。我正在做这样的事情:
// 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" (常规字符串)。但仍然是同样的错误。
你知道问题出在哪里吗?
发布于 2011-04-08 05:28:32
我认为严格地说,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,而微软的资源编译器将定义RC_INVOKED。
让我们假设代码覆盖率工具在运行时定义了COVERAGE_TOOL。你可以用下面这样的东西让两个工具都满意:
#if COVERAGE_TOOL
#define COVERAGE(x) PRAGMA(Coverage_tool x)
#define PRAGMA(x) _Pragma(#x)
#else
#define COVERAGE(x)
#endif但我只是在猜测。我希望coverage工具的文档会非常明确地说明,如果它支持MSVC,那么如何将这些指令集成到您的代码中-您应该在那里查找详细信息(或者咨询供应商)。
发布于 2011-08-19 04:10:15
对于Visual Studio2005,__pragma关键字是未记录的。它在Visual Studio2008中有文档记录和提供。请注意,您需要两个下划线字符,并且全部为小写。
Pragma Directives and the __Pragma Keyword
https://stackoverflow.com/questions/5587655
复制相似问题