gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:41:47 26 4
gpt4 key购买 nike

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

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 templatea resulting time64_limits.h header file 的例子.

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com