C언어 가변 변수 함수에서 기본 인자 진급
글쓴이: alee / 작성시간: 토, 2011/02/26 - 1:08오후
C언어에서 다음과 같은 가변 변수 함수를 사용하는 경우 C 표준에 의하면 부동소수점 숫자의 경우 항상
double 형으로 기본 인자 진급이 일어나기 때문에 va_arg()를 사용해 인자를 해석할 때 double형으로
해석해야 합니다.
int main() { ... my_function(1, (float) 1.0f); ... } void my_function(int N, ...) { va_list ap; va_start(ap, N); float F = va_arg(ap, double); // or va_arg(ap, float)? ... }
그런데, my_function()을 호출할 때 항상 두 번째 argument를 (float)으로 명시적으로 캐스팅하여
넘긴다고 보장할 수 있는 경우 my_function()함수 안의 va_arg()에서 double이 아닌 float으로
해석하는게 가능한지요? 또, 다음과 같이 float형 변수를 포함하고 있는 구조체를 넘기는 경우, 구조체
안의 float 변수에 들어 있는 값도 double로 기본 인자 진급이 일어나는지요?
typedef struct { float F; } float_struct; typedef struct { double F; } double_struct; int main() { ... float_struct Struct = { 1.0f }; my_function(1, Struct); ... } void my_function(int N, ...) { va_list ap; va_start(ap, N); float_struct Struct = va_arg(ap, float_struct); // or va_arg(ap, double_struct)? ... }
혹시 C언어 표준을 정확히 이해하고 계신 분이 계시면 답변을 부탁 드립니다.
Forums:
1. 같은 type 으로의 cast 연산은 무의미함
1. 같은 type 으로의 cast 연산은 무의미함 (1.0f 의 type 은 이미 float)
2. 넘기는 것은 구조체이지 float 이 아님
C언어 표준을 정확히 이해하진 못해서 제의견을 말씀드리면...
인용: "C언어에서 다음과 같은 가변 변수 함수를 사용하는 경우 C 표준에 의하면 부동소수점 숫자의 경우 항상
double 형으로 기본 인자 진급이 일어나기 때문에 va_arg()를 사용해 인자를 해석할 때 double형으로
해석해야 합니다."
말씀하신 대로 라면 double 로의 '인자 진급'은 피할수 없을것 같습니다.
다음과 같겠죠.
double d = (float) 1.0f;
이미 1.0f 가 float 이더라도, float로 명시적으로 캐스팅 하더라도
인용: "부동소수점 숫자의 경우 항상 double 형으로 기본 인자 진급이 일어나기 때문에"
double로 '인자 진급' 되는것을 피할수 없겠죠..
댓글 달기