2013-07-03 1 views
1

J'étudie le code de l'exemple de rbb_server de la bibliothèque de ENC28J60 pour Arduino (je mettrais le lien ici si je pouvais) et je l'ai remarqué ce morceau bizarre de code:Comment PSTR peut-il recevoir plusieurs chaînes non séparées par des virgules?

static word homePage() { 
    long t = millis()/1000; 
    word h = t/3600; 
    byte m = (t/60) % 60; 
    byte s = t % 60; 
    bfill = ether.tcpOffset(); 
    bfill.emit_p(PSTR(
    "HTTP/1.0 200 OK\r\n" 
    "Content-Type: text/html\r\n" 
    "Pragma: no-cache\r\n" 
    "\r\n" 
    "<meta http-equiv='refresh' content='1'/>" 
    "<title>RBBB server</title>" 
    "<h1>$D$D:$D$D:$D$D</h1>"), 
     h/10, h%10, m/10, m%10, s/10, s%10); 
    return bfill.position(); 
} 

Comment cela peut-PSTR (........) compiler si les chaînes n'ont même pas une virgule qui les sépare?

Je l'ai regardé pour cette PSTR définition de macro et je l'ai trouvé ceci:

Used to declare a static pointer to a string in program space. */ 
# define PSTR(s) ((const PROGMEM char *)(s)) 
#else /* !DOXYGEN */ 
/* The real thing. */ 
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];})) 
#endif /* DOXYGEN */ 

que vous pouvez trouver dans le fichier pgmspace.h quelque part dans le dossier IDE Arduino.

Comment cela peut même compiler ??

Merci!

Répondre

1

Il existe une règle en C (C99, 6.4.5p4) qui indique que deux chaînes littérales adjacent (qu'ils soient sur des lignes différentes):

"HTTP/1.0 200 OK\r\n" 
"Content-Type: text/html\r\n" 

sont concaténées dans une chaîne de caractères et sont équivalents à:

"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n" 

Cela se fait par le préprocesseur en phase de traduction 6.

0

littéraux de chaîne adjacents sont automatiquement concaténées par le compilateur en une seule chaîne littérale.

printf("H" "e" "l" "l" "o"); 

est équivalent à

printf("Hello"); 
Questions connexes