如何定义自定义文字字面量?

3

我正在将一些源代码从一种脚本语言(PAWN)转换为Windows上的编程语言(C ++)。

这个源代码到处都存在以二进制文字的形式出现的数百万个字面量:

data[] = 
{
    0b11111111111011111110110111111110, 0b00000000001111111111111111111111,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    ///some million lines later...
    0b00000000000000000000000000000000, 0b11111111111111111111111110000000,
    0b11100001001111111111111111111111, 0b11110111111111111111111111111111,
    0b11111111111111111111111111111111, 0b11111111111111111111111111111111,

不幸的是,Visual Studio 2013不支持用户定义字面量标准。

有没有什么方法可以实现这个功能?也许使用C ++的010101_b或类似的东西,再加上一点boost库的支持?


可能是二进制字面量?的重复问题。 - 2501
搜索是你的好朋友。 - 2501
1
为什么不用你最喜欢的脚本语言(例如我的是Python)编写一个脚本,以此文件作为输入并生成一个C++文件作为输出呢? - barak manos
确实不错的想法,虽然需要额外的时间,但还可以。然而,这仍然没有回答问题,而且如果要在数百万行上重复执行此操作,我更喜欢一个可替换的解决方案 ;) 我从https://dev59.com/iXRB5IYBdhLWcg3wuZU1得到了一个答案,答案是:https://dev59.com/iXRB5IYBdhLWcg3wuZU1#537346 我只是做了这个:#include <bitset> const unsigned long GETBOOL(std::string str) { return std::bitset<32>(str).to_ulong(); } GETBOOL("11111111111011111110110111111110"), - Gizmo
2个回答

1
我强烈建议您使用脚本转换源代码。
无论如何,如果您对Boost.PP感兴趣:
#define FROM_BINARY(s, data, elem) sum(#elem+2)

constexpr auto sum(char const* str, std::uintmax_t val = 0) -> decltype(val)
{
    return !*str? val : sum(str+1, (val << 1) + *str - '0');
}

unsigned data[]
{
    BOOST_PP_TUPLE_REM_CTOR(BOOST_PP_SEQ_TO_TUPLE(
        BOOST_PP_SEQ_TRANSFORM(FROM_BINARY, , 
            BOOST_PP_VARIADIC_TO_SEQ(
    0b11111111111011111110110111111110, 0b00000000001111111111111111111111,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    ///some million lines later...
    0b00000000000000000000000000000000, 0b11111111111111111111111110000000,
    0b11100001001111111111111111111111, 0b11110111111111111111111111111111,
    0b11111111111111111111111111111111, 0b11111111111111111111111111111111))))
};

请注意,这可能会严重降低编译时间。因此,请再次尝试一次性转换源代码。

0

我建议编写一个简单、小巧的控制台程序,将二进制文字转换为十六进制文字。

以下是我会使用的步骤:

  1. 复制文件。
  2. 使用文本编辑器删除第一个文字之前的所有内容。
  3. 删除最后一个文字之后的所有内容。
  4. 保存。
  5. 用换行符替换", "。
  6. 保存。

现在你有了一个包含二进制文字的文本文件,每行一个。

编写一个程序来读取文件,将其转换为十六进制文字并输出。

然后通过粘贴所有缺失的内容来编辑此文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接