2017-09-18 3 views
3

Kann ich #define Variable und char * in Strcmp wie folgt vergleichen.Ist #define var schlecht mit strcmp?

#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; 
} 

Gibt es ein Risiko comapre #define mit char * wie oben Beispiel?

+3

Nun, dieses Beispiel wird nicht kompiliert, also denke ich, gibt es das Risiko – UnholySheep

+0

Nein, der Präprozessor ersetzt nur Ihr Token durch das Literal (dh wenn das Token mit dem Literal übereinstimmt, was in Ihrem Code nicht der Fall ist)) –

+1

@UnholySheep Ich bearbeite jetzt das wird kompiliert –

Antwort

5

uns nicht vertrauen Sie, vertrauen auf die Präprozessorausgabe

File "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;  
} 

jetzt:

gcc -E foo.c 

viel ausgegeben, weil der Standardsystembibliotheken dann ...:

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

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

    return 0; 
} 

Wie Sie sehen, wurde Ihre Definition sicher durch das String-Literal ersetzt.

Wenn Sie Zweifel haben, nur diese Methode anwenden, um sicherzustellen, (mehr sinnvoll, wenn in Strings oder verketten Token konvertiert, gibt es Fallen zu vermeiden)

In Ihrem Fall, können Sie auch das Makro und Verwendung vermeiden könnten :

static const char *var = "hello"; 

die nur 1 Auftreten von "hello" gesetzt (Datenspeicher speichert) garantiert, dass.

+0

In Überprüfung werde ich aufgefordert, #define mit statischen Kosten zu entfernen nicht sicher, warum –

+0

einige Leute nicht mögen Makros. In diesem Fall ist 'static const char *' ebenfalls OK und vielleicht sogar besser, da es garantiert, dass der Speicher der Zeichenfolge nicht dupliziert wird. –

+0

Vielen Dank erhalten Sie Ihren Punkt –

2

Nein, es besteht keine Gefahr, #define mit char * zu berechnen.

#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;  
    }