使用预处理器在c++代码中嵌入JSON作为字符串

Embedding JSON as a string in C++ code using preprocessor

本文关键字:JSON 字符串 代码 预处理 处理器 c++      更新时间:2023-10-16

我在Chromium项目中看到了c++和JSON代码的混合。

例如在这个文件中:配置/software_rendering_list_json.cc

这个宏有魔力吗?

#define LONG_STRING_CONST(...) #__VA_ARGS__

它如何"字符串化"任意JSON内容?

Cameron的回答绝对正确。

然而,从c++ 11开始,有一个编译器支持的方法来创建原始字符串字面值。

char const *string = R"someToken({
  "name": "software rendering list",
  "version": "10.9",
  "entries": [
    {
      "id": 1,
      "description": "ATI Radeon X1900 is not compatible with WebGL on the Mac",
      "webkit_bugs": [47028],
      "os": {
        "type": "macosx"
      },
      "vendor_id": "0x1002",
      "device_id": ["0x7249"],
      "features": [
        "webgl",
        "flash_3d",
        "flash_stage3d"
      ]
    },
    {
      "id": 3,
      "description": "GL driver is software rendered. GPU acceleration is disabled",
      "cr_bugs": [59302, 315217],
      "os": {
        "type": "linux"
      },
      "gl_renderer": "(?i).*software.*",
      "features": [
        "all"
      ]
    }
  ]
})someToken";

请注意,它们之间有一些细微的差别。

最明显的是,宏将去掉C/c++注释,宏将把所有空白合并成一个空格。

关于字符串字面值的更多细节可以在很多地方找到。我喜欢这个

你猜对了!

宏体中的

#将随后的标记转换为包含该标记文本的C字符串字面值。在这种情况下,下一个标记是特殊的__VA_ARGS__宏关键字,它被替换为(可变)宏的所有参数,它对应于源代码中的JSON。