"콘솔에 인쇄하고 파일에 쓰기"를 수행하는 마르코를 정의하고 싶습니다. 아래는 내 코드입니다. 누군가 "세그멘테이션 오류 (코어 덤프)"가 발생한 이유를 보여줄 수 있습니다.
#define TRC_DP(fmt, args...) \
do {\
FILE * fp = fopen("/home/debug.log","a+");\
fprintf(fp,"TRC_DP(%s:%d):\t" fmt, __func__, __LINE__, ##args);\
printf(fmt, ##args);\
fclose(fp);\
}while(0);
다음은 몇 가지 버그입니다.
TRC_DP(fmt, args...)
유효한 표준 C가 아닙니다.fopen
성공 했는지 항상 확인해야합니다 .다음과 같은 방법으로 문제를 해결할 수 있습니다.
#define TRC_DP(fmt, ...) \
do {\
FILE * fp = fopen("/home/debug.log","a+");\
if(fp != NULL) { \
fprintf(fp,"TRC_DP(%s:%d):\t" fmt, __func__, __LINE__, __VA_ARGS__); \
printf(fmt, __VA_ARGS__);\
fclose(fp);\
} \
}while(0)
그러나 이것은 심각한 추악한 코드입니다. 필요한 경우이를 함수로 바꾸고 런타임에서 형식 문자열을 연결해야합니다.
전반적으로 가능한 한 가변 인수 함수 나 매크로를 피해야합니다. 추악 할뿐만 아니라 매우 위험합니다. 변수 인수의 존재는 일반적으로 잘못된 프로그램 설계의 매우 강력한 표시입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다