對於這樣的事情,我建議寫一個模板頭文件(不是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的一個例子。
我會寫另一個用來預處理源代碼的程序。 – Barmar
沿着同樣的路線,我建議你把這些IPv6常量放在一個JSON配置文件中,然後寫一個模板頭文件。使用程序來處理常量並填寫模板中的空白。使用你喜歡的任何編程語言和模板系統。 – Schwern
你可以在*編碼*時間做到這一點。這可能是通過代碼生成器,或通過您似乎已執行的手動計算。 –