这是一个长串,但我想知道是否有什么技巧可以在编译时将一个恒定的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] }
}

我在2003年的图书馆里使用了这种技术它必须探测系统以确定时间限制.h,然后将这些限制编码到自定义头文件中munge_config读取配置值(从构建系统,而不是从JSON配置,但结果相同:散列),并填充模板这是time64_limits.h.in templatea resulting time64_limits.h header file的一个例子。

关于c - c:在编译时将ipv6地址转换为字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43378526/

10-13 06:49