2017-04-12 1 views
2

이것은 장황하지만, 정수 ipv6 주소 문자열을 컴파일 시간에 두 개의 64 비트 정수로 변환하는 트릭이 있는지 궁금합니다. (이것은 임베디드 시스템에 있으므로 런타임과 메모리 모두 중요한 가치를 지닙니다). 생산 것c : 컴파일시에 ipv6 주소를 문자열로 변환

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

: 이상적으로 코드가 같은 것을 보일 것

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

소스 코드를 사전 처리하는 데 사용하는 다른 프로그램을 작성합니다. – Barmar

+0

같은 줄에 나와있는 것처럼이 IPv6 상수를 JSON 구성 파일에 넣고 템플릿 헤더 파일을 작성하는 것이 좋습니다. 프로그램을 사용하여 상수를 처리하고 템플리트에서 공백을 채 웁니다. 원하는 프로그래밍 언어와 템플릿 시스템을 사용하십시오. – Schwern

+0

* 코딩 할 때 * 할 수 있습니다. 코드 생성기를 사용하거나 수행 한 것으로 보이는 손 - 계산의 종류에 의한 것일 수 있습니다. –

답변

1

을 내가 템플릿 헤더 파일 (안 C++ 템플릿을 작성 권하고 싶습니다 이런 종류의 위해를하지만, 입력 - 인 - 빈 템플릿), 사람이 읽을 수있는 값을 설정 파일에 넣고 작은 프로그램을 사용하여 공백을 채 웁니다.

예를 들어 구성 파일이 JSON 일 수 있습니다. (이것은 분명히 하나의 값에 대한 잔인한, 난 그냥 기술을 보여주는거야.)

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

당신은 기존 템플릿 언어를 사용하거나 자신을 만들 수 있습니다. C 헤더 파일과 같은 단순한 것을 위해, 당신은 아주 간단한 것을 빠져 나갈 수 있습니다.

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

그리고 설정을 읽고 루비와 같은 유비쿼터스 스크립팅 언어로 템플릿을 처리하는 코드.

#!/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의 예입니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 이것이 흥미 롭지 만, 제 목적을 위해 주소를 업데이트하는 것이 더 빠르고 편리합니다. (주요 목표 중 하나는 가독성이었습니다). – blackghost

+0

@ John 원래 값을 주석으로 추가 할 수 있습니다. – Schwern

관련 문제