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.
Nun, dieses Beispiel wird nicht kompiliert, also denke ich, gibt es das Risiko – UnholySheep
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)) –
@UnholySheep Ich bearbeite jetzt das wird kompiliert –