- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 #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/
我正在尝试在 #define 中使用 #pragma。我正在做这样的事情: // I assume this is a correct syntax. Please point out if it i
在实现我自己的 C11 编译器时,我试图弄清楚如何准确处理 _Pragma 关键字/运算符。 C11 §6.10.9 将 _Pragma 描述为运算符,因此似乎可以使用宏重新定义它,即 #define
_Pragma 的参数是一个字符串,所以我认为当您以正常的 c 预处理器方式将字符串粘贴在一起(即,将它们彼此相邻)时,您可以为 _Pragma 的参数形成一个新字符串。然而 _Pragma("GCC
我想要一个像这样调用的宏: GCC_WARNING(-Wuninitialized) 扩展成这样的代码: _Pragma("GCC diagnostic ignored \"-Wuninitializ
我试图在从宏扩展的代码中禁用 g++ 警告。据我了解,_Pragma 应遵循宏用法,并且在使用 g++ 编译时不应触发 Wparentheses: #include #define TEST(exp
我想通过创建适当的宏来简化一些预处理器代码。我想包装 #ifdef _OPENMP _Pragma("omp critical(stdout)") #endif 成单 _OMP_CRITICA
我正在尝试做类似于 another question 的事情,即有条件地在我的程序中包含 OpenMP 编译指示。但是,我想更进一步,避免用户每次使用 pragma 时都需要指定 omp。换句话说,我
是否有类似 ANSI C 运算符 _Pragma 的东西?在 Visual C++ 中? 例如,我试图定义以下宏: #ifdef _OPENMP #define PRAGMA_IF_OPENMP(x)
如果使用 gcc -E 进行预处理,以下代码会从 _Pragma("GCC error") 中产生一些错误: _Pragma("GCC error \"ERROR\"") // error #defi
看了一些Objective-c的代码,发现界面上面有这句话,谁能告诉我是什么意思,或者感谢提供一些关于clang的教程,非常感谢 最佳答案 在较新版本的 Objective-C 编译器 (clang)
我是一名优秀的程序员,十分优秀!