2017-09-18 13 views
3

아래와 같이 strcmp에 #definechar *을 비교할 수 있습니까?strcmp에 #define var bad가 있습니까?

#include<stdio.h> 
#include<string.h> 
#define var "hello" 
int main() 
{ 
char *p ="hello"; 
if(strcmp(p,var)==0) 
printf("same\n"); 
else 
printf("not same\n"); 
return 0; 
} 

위의 예와 같은 char * 어떤 위험 comapre #define이 있습니까?

+3

이 예제는 컴파일되지 않을 것입니다. 그래서 위험이 있다고 생각합니다. – UnholySheep

+0

아니요, 전처리 기는 리터럴로 토큰을 바꿉니다 (즉, 토큰이 리터럴과 일치하면 코드에 해당하지 않습니다).) –

+1

@UnholySheep 이제 편집 할 것입니다 –

답변

5
우리를 신뢰하지 마십시오

처리기 출력을 신뢰

파일 "foo.c를"지금

#include <stdio.h> 
#include <string.h> 
#define var "hello" 

int main(void) 
{ 
    char *buf="hello"; 

    if(strcmp(buf,var)==0) // Is this good 
     printf("same"); 

    return 0;  
} 

: 때문에 출력의

gcc -E foo.c 

많은 그러면 표준 시스템 라이브러리 ... :

# 5 "foo.c" 
int main(void) 
{ 
    char *buf="hello"; 

    if(strcmp(buf,"hello")==0) 
     printf("same"); 

    return 0; 
} 

당신의 정의가 안전하게 문자열 상수로 대체되었습니다. 당신은 의심의 여지가있을 때, 단지 확인하기 위해이 방법을 적용

귀하의 경우에는

, 당신은 또한 매크로 및 사용을 피할 수 (문자열로 변환하거나 토큰을 연결 할 때 더 유용는 피할 함정이 있습니다)

static const char *var = "hello"; 

이 1 회만 설정되도록 (데이터 메모리 절약) 보장합니다.

+0

리뷰에서 #define을 제거하라는 메시지가 나타났습니다. 이유는 확실하지 않습니다 –

+0

일부 사람들은 매크로가 마음에 들지 않습니다. 이 경우,'static const char *'도 OK이며, 문자열의 메모리가 중복되지 않기 때문에 더 좋을 수도 있습니다. –

+0

감사합니다. –

2

아니요, # 문자를 char *와 함께 사용하면 문제가 없습니다.

#include <stdio.h> 
    #include <string.h> 
    #define var "hello" 

    int main(void) 
    { 
     char *buf="hello"; 

     if(strcmp(buf,var)==0) // Is this good 
      printf("same"); 

     return 0;  
    }