F.R.I.D.A.Y.

VS ERROR C4477 : *형식의 인수가 필요하지만 variadic 인수 1의 형식이 *입니다. 본문

DEV/Tip

VS ERROR C4477 : *형식의 인수가 필요하지만 variadic 인수 1의 형식이 *입니다.

F.R.I.D.A.Y. 2019. 1. 16. 22:46
반응형

 처음 프로그래밍을 배울 때, 종종 하는 실수가 있는데 그중 하나가 C4477 오류입니다. 대부분 printf, scanf 등의 입출력 함수를 이용할 때 발생합니다.



 이 문제의 코드는 아래와 같습니다.


#include <stdio.h>

int main(void) {
	float test = 1.0f;

	printf("%d", test);

	return 0;
}

 float 변수인 test를 출력하기 위해 printf 함수를 사용하고 서식 지정자로 %d를 사용했군요?

 아쉽게도 float 자료형을 출력할 때는 %f나 %lf를 사용해야합니다.


 서식 지정자는 아래와 같습니다.

자료형 

서식 지정자 

 char 

 %hhd 

 unsigned char 

 %hhu 

 short 

 %hd 

 unsigned short 

 %hu 

 int 

 %d 

 unsigned int 

 %u 

 long 

 %ld 

 unsigned long 

 %lu 

 long long 

 %lld 

 unsigned long long 

 %llu 

 float 

 %f 

 double 

 %lf

 long double 

 %Lf 


 정수는 int를 기준으로 크기에 비례하여 작은만큼 n개의 h를, 크면 l(엘)을 붙여줍니다. short는 int보다 1/(2^1)만큼이므로 h가 하나 붙고, char는 int의 1/(2^2) 배이기 때문에 두 개의 h가 붙게 되죠.

 long의 경우 32비트 프로그램에서는 4바이트이지만, 64비트 프로그램에서는 8바이트로 작용합니다. 작동하는 아키텍쳐에 따라 달라지기 때문에 하나로 통일하지 않고 따로 만들었다고 보면 되겠군요.


 아무튼, 이러한 서식 지정자가 중요한 이유는 함수가 전달받은 인자들을 서식지정자를 기준으로 메모리를 받아들이기 때문입니다.


 간단히 printf 함수를 볼까요?

 어지럽게 알기 힘든 코드들이지만, 노란색으로 밑줄 친부분을 보니 가변인자입니다. 이 가변인자는 크기를 알 수 없기 때문에 사용시에 캐스팅 과정을 거쳐야하는데, 이 가변인자를 무엇으로 캐스팅할지 결정하는 요인이 서식 지정자입니다.


 우리나라에서 물건을 사려면 한국 돈이 있어야합니다. 그런데 가게 점원에게 외국 돈을 주면서 계산해달라고 하면 점원이 어이가 없겠죠? 그러니까 자료형에 맞는 서식 지정자를 사용합시다.


 참고로 double은 printf에서는 %f를 사용해도 상관없습니다. 경고는 날지언정 큰 문제 없어요. 그 이유는 이 포스트를 참고하세요

728x90
반응형
Comments