gpt4 book ai didi

c - _Pragma 不工作

转载 作者:行者123 更新时间:2023-12-03 21:29:36 25 4
gpt4 key购买 nike

我正在尝试在 #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). 

这里的 on 和 off 是字符串。

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

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

知道问题出在哪里吗?

最佳答案

我认为严格来说,Lindydancer's solution需要采用以下形式:

#define COVERAGE(x) PRAGMA(Coverage_tool x)
#define PRAGMA(x) _Pragma(#x)

这是标准在示例中使用的形式,它需要这样,因为 _Pragma 运算符处理发生在字符串文字连接之前的翻译阶段。 _Pragma 的定义方式是在生成相应的 #pragma 时,它只会处理去除前导引号和尾随引号 - 而不是来自 '连接的文字。

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

注意:如果 #pragma Coverage_tool pragma 需要在 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 支持的文档化编译指示,所以我认为仍然缺少一些重要信息。

由于您在编译器之外有一些代码覆盖工具正在处理此 pragma,我认为您需要对编译器隐藏它。该工具可能会定义一些它在处理时识别的宏名称,但在编译器执行其工作时不会定义这些名称。比如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

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

关于c - _Pragma 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com