当前位置: 首页 > 知识库问答 >
问题:

如何在C中包含使用C关键字作为标识符的C标头?

徐旻
2023-03-14

我一直在用C语言,用clang编译。我想包括

不幸的是,这个标题对一些字段名(比如第727行)使用了explicit,这是C语言中的一个关键字。

有没有办法解决这个问题?

xcb/xkb. h:

// ...

#ifdef __cplusplus
extern "C" {
#endif

// ...

typedef struct xcb_xkb_set_explicit_t {
    xcb_keycode_t keycode;
    uint8_t       explicit;
} xcb_xkb_set_explicit_t;

// ...

#ifdef __cplusplus
}
#endif

// ...

共有2个答案

阙星渊
2023-03-14

如何在C中包含使用C关键字作为标识符的C标头?

没有标准的一致性解决方案能够包含此类标题。为了能够在C中包含头,它必须用有效的C编写。在C报头的情况下,它必须被写在C和C的公共子集中。

理想的解决方案是将标头固定为有效的C。符合标准的解决方法是在C中编写符合C的包装器。

夹谷沛
2023-03-14

使用宏重命名字段:

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wkeyword-macro"
#endif
#define explicit explicit_
#ifdef __clang__
#pragma clang diagnostic pop
#endif

#include <xcb/xkb.h>

#undef explicit

如果我没记错的话,这在标准C中是非法的,但GCC、Clang(带pragma)和MSVC都接受它。

 类似资料:
  • 我有以下问题:我正在为GLSL着色语言创建一个编辑器。我希望在某些情况下允许关键字作为标识符,因为内置函数的名称可以用作标识符。 例如: 和不被识别为标识符。 完整语法供参考:http://paste2.org/YwDNkBYW 解决方案: 我创建了一个包含所有内置函数的源文件: 我使用保留的关键字来区分内置函数和本地创建的函数: ...在ScopeProvider中添加了以下内容: 在中,我在迭

  • 本文向大家介绍C#在标识符中使用转义序列,包括了C#在标识符中使用转义序列的使用技巧和注意事项,需要的朋友参考一下 示例 转义序列不限于string和char文字。 假设您需要重写第三方方法: 并假定该字符Œ在用于C#源文件的字符编码中不可用。你是幸运的,它允许使用的类型逃逸\u####或者\U########在标识中的代码。所以写是合法的: 并且C#编译器将知道Œ并且\u0152是相同的字符。

  • asm 语法: asm( "instruction" ); asm允许你在你的代码中直接插入汇编语言指令, 各种不同的编译器为这一个指令允许不一致形式, 比如:   asm { instruction-sequence } or asm( instruction ); auto 关键字auto是用来声明完全可选择的局部变量的 bool

  • 问题内容: 如何在C#中使用正则表达式删除所有HTML标记,包括&nbsp。我的弦看起来像 问题答案: 如果您不能使用面向HTML解析器的解决方案来过滤标签,则这里有一个简单的正则表达式。 理想情况下,您应该再次通过正则表达式过滤器,该过滤器将多个空格

  • 本文向大家介绍C# 中static关键字的作用?相关面试题,主要包含被问及C# 中static关键字的作用?时的应答技巧和注意事项,需要的朋友参考一下 对类有意义的字段和方法使用static关键字修饰,称为静态成员,通过类名加访问操作符“.”进行访问; 对类的实例有意义的字段和方法不加static关键字,称为非静态成员或实例成员。 注: 静态字段在内存中只有一个拷贝,非静态字段则是在每个实例对象中

  • 我试图让一些sql关键字作为标识符被接受,当用作标识符时。Antlr的书p210提出了这个技巧: 我也有类似的东西,但它不起作用,我想这是我的误解。是标识符的解析规则,因此: 是ident的主要lex规则。大致是这样的(这里简化了),它起作用了: 如果我给它作为输入('aaa'不是关键字),它将解析: 但是如果我给它,它就会失败--'sparse'是一个关键字: 也许我很笨,但我不明白为什么,因为