c:在编译时将 ipv6 地址转换为字符串



这是一个远景,但我想知道是否有任何技巧可以在编译时将常量的ipv6地址字符串转换为两个64位整数。 (这是在嵌入式系统上,因此运行时和内存都是有价值的商品)。 理想情况下,代码如下所示:

const uint64_t addr[2] = { IPV6_TO_UINT64S("::ffff:192.168.1.1") };

这将产生:

const uint64_t addr[2] = { 0x0000000000000000ULL, 0x0000ffffc0a80101ULL };

对于这种事情,我建议编写一个模板头文件(不是C++模板,而是填空模板),将人类可读的值放在配置文件中,并使用一个小程序来填充空白。

例如,配置文件可能采用 JSON 格式。(对于单个值来说,这显然是矫枉过正的,我只是在展示技术。

{
"addr": "::ffff:192.168.1.1"
}

您可以使用现有的模板语言,也可以自行创建。对于像 C 头文件这样简单的东西,你可以使用非常简单的东西。

const uint64_t addr[2] = { %%addr%% };

读取配置和处理模板的代码在像 Ruby 这样的无处不在的脚本语言中很简单。

#!/usr/bin/env ruby
require 'json'
template, config_file = ARGV[0..1]
# Load the config file
config = JSON.load( File.new(config_file) )
# Ensure missing config variables throw an error
config.default_proc = proc do |hash, key|
throw "Config key '#{key}' is missing from #{config_file}"
end
# ...do whatever processing on the config variables you want...
# Fill in the template.
IO.foreach(template) { |line|
puts line.gsub(/%%(.*?)%%/) { config[$1] }
}

我在 y2038 库中使用了这种技术。它必须探测系统以确定 time.h 的限制,然后将这些限制编码到自定义头文件中。munge_config读取配置值(来自构建系统,而不是来自 JSON 配置,但结果相同:哈希),并填写模板。这是 time64_limits.h.in 模板和生成的 time64_limits.h 头文件的示例。

最新更新