这是一个远景,但我想知道是否有任何技巧可以在编译时将常量ipv6地址字符串转换为两个64位整数。 (这是在嵌入式系统上,因此运行时和内存都是有价值的商品)。理想情况下,代码看起来像:
const uint64_t addr[2] = { IPV6_TO_UINT64S("::ffff:192.168.1.1") };
会产生:
const uint64_t addr[2] = { 0x0000000000000000ULL, 0x0000ffffc0a80101ULL };
答案 0 :(得分:1)
对于这类事情,我建议编写模板头文件(不是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 template和a resulting time64_limits.h header file的示例。