首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_Pragma不工作

_Pragma不工作
EN

Stack Overflow用户
提问于 2011-04-08 05:05:09
回答 2查看 2.4K关注 0票数 2

我正在尝试在#define中使用#pragma。我正在做这样的事情:

代码语言:javascript
复制
// I assume this is a correct syntax. Please point out if it is wrong
#define COVERAGE(x)  _Pragma (Coverage_tool #x)

然后在代码中,我将其用作

代码语言:javascript
复制
COVERAGE(off) or COVERAGE(on). 

这里开和关是字符串。

但是当我这样做时,我得到一个编译错误,显示为"expected ) near off".

我还尝试了带引号的"off"/"on" (常规字符串)。但仍然是同样的错误。

你知道问题出在哪里吗?

EN

回答 2

Stack Overflow用户

发布于 2011-04-08 05:28:32

我认为严格地说,Lindydancer's solution需要这样的形式:

代码语言:javascript
复制
#define COVERAGE(x) PRAGMA(Coverage_tool x)
#define PRAGMA(x) _Pragma(#x)

这是标准在示例中使用的形式,并且需要以这种方式进行,因为_Pragma运算符处理发生在字符串文字连接之前的转换阶段。_Pragma的定义方式是,当生成相应的#pragma时,它只处理去掉前导引号和尾随引号-而不是来自“连接”字面量的任何其他引号。

但是,您的编译器可能会容忍另一种方法(GCC不能)。

注意:如果#pragma Coverage_tool杂注需要用引号将on/off操作数引起来,则COVERAGE宏需要为:

代码语言:javascript
复制
#define COVERAGE(x) PRAGMA(Coverage_tool #x)

注意#2:如果你使用的是Microsoft C,我认为你需要:

代码语言:javascript
复制
#define COVERAGE(x) PRAGMA(Coverage_tool x)
#define PRAGMA(x) __pragma(x)

因为微软的指令拼写略有不同,更令人恼火的是,它不想让操作符的参数被引号括起来。

但是Coverage_tool不是MSVC支持的文档编译指示,所以我认为仍然缺少一些重要的信息。

由于您在处理此杂注的编译器之外有一些代码覆盖工具,因此我认为您需要对编译器隐藏它。该工具可能会定义一些宏名称,这些宏名称在处理时会被识别,但在编译器执行其工作时不会被定义。例如,lint将在处理时定义宏lint,而微软的资源编译器将定义RC_INVOKED

让我们假设代码覆盖率工具在运行时定义了COVERAGE_TOOL。你可以用下面这样的东西让两个工具都满意:

代码语言:javascript
复制
#if COVERAGE_TOOL
#define COVERAGE(x) PRAGMA(Coverage_tool x)
#define PRAGMA(x) _Pragma(#x)
#else
#define COVERAGE(x)
#endif

但我只是在猜测。我希望coverage工具的文档会非常明确地说明,如果它支持MSVC,那么如何将这些指令集成到您的代码中-您应该在那里查找详细信息(或者咨询供应商)。

票数 7
EN

Stack Overflow用户

发布于 2011-08-19 04:10:15

对于Visual Studio2005,__pragma关键字是未记录的。它在Visual Studio2008中有文档记录和提供。请注意,您需要两个下划线字符,并且全部为小写。

Pragma Directives and the __Pragma Keyword

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5587655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档