본문 바로가기
알고리즘/[PRO] 삼성 SW 역량 테스트 B형

#define printf 재정의를 이용한 로그 출력 디버깅 팁

by 피로물든딸기 2023. 7. 29.
반응형

삼성 B형 전체 링크

삼성 C형 전체 링크

 

printf를 이용하여 로그를 출력해서 디버깅을 완료하였다고 하자.

이제 정답을 제출해야 되므로 printf모두 삭제하거나, 주석 처리해야 한다.

 

하지만 이 과정은 꽤 번거롭다.

지우는 것도 일이지만, 정답이 아닌 경우 지웠던 printf다시 복구하는데 시간이 꽤 많이 쓰인다.

 

#define을 이용해서 printf를 재정의하면 이런 일을 간단히 해결할 수 있다.

 

아래 코드를 실행해보자.

#include <stdio.h>

#define P printf

int main()
{
	P("hello!\n");
	P(">> %s %d\n", "world", 100);

	return 0;
}

 

#define을 이용하여  printf를 P로 재정의했을 뿐이다.

그러니 원래 printf의 효과와 같다.

 

이제 #define P뒤에 printf를 지워보자.

#include <stdio.h>

#define P

int main()
{
	P("hello!\n");
	P(">> %s %d\n", "world", 100);

	return 0;
}

 

PRINTF 뒤에 아무것도 정의하지 않았기 때문에 printf가 아무 효과가 발생하지 않는다.

 

실제 코드를 변경해보면서 테스트해보자.

 

삼성 SW 역량 시험 환경에서 User code(user.cpp)에 코드를 제출할 때 코드에 printf가 남아 있으면,

'printf' was not declared in this scope 에러가 발생한다.

컴파일 오류 : 오류 메시지 : solution.cpp: In funciton 'xxx':
error: 'printf' was not declared in this scope

 

하지만 위의 코드는 #define으로 P 아무것도 정의하지 않았기 때문에 에러가 발생하지 않는다.

 

참고

> #define printf printf 로 사용해도 같은 효과를 얻을 수 있다.

printf를 printf로 다시 정의하였고, printf를 다시 아무것도 정의하지 않으면 아무것도 출력하지 않는다.

 

하지만, 이 경우에는 시험환경에서  

 

허용하지 않는 라이브러리가 사용되었습니다. >printf

 

에러가 발생한다.

 

그러므로 다른 이름으로 printf를 정의 하는 것이 편하다.


특정 로그만 지우기

 

아래와 같이 printf를 여러 개 새로 정의하고, 특정 함수나 원하는 위치에서만 로그를 세분화해서 사용할 수 있다.

#include <stdio.h>

#define P1 printf
#define P2 printf
#define P3 printf

int main()
{
	P1("hello!\n");
	P2(">> %s %d\n", "world", 100);
	P3("I love C++\n");

	return 0;
}

 

P2라고 정의한 곳만 로그를 지우고 싶다면 P2 뒤에 printf를 지우고 아무것도 정의하지 않으면 된다.

#include <stdio.h>

#define P1 printf
#define P2 
#define P3 printf

int main()
{
	P1("hello!\n");
	P2(">> %s %d\n", "world", 100);
	P3("I love C++\n");

	return 0;
}

 

P2로 정의한 [ >> %s %d\n", "world", 100 ]은 아무일도 하지 않는다.

 

따라서 출력할 로그를 처음부터 세분화한다면, 원하는 로그만 쉽게 끄고 켤 수 있다.

반응형

댓글