2016-11-02 95 views
1

我想弄清楚在C代码,我坚持试图了解什么是预处理器的实际部分。的代码,我不明白的部分是以下几点:一个复杂的语法在C中的预处理器

#define ERR(source) (perror(source),\ 
     fprintf(stderr,"%s:%d\n",__FILE__,__LINE__),\ 
     exit(EXIT_FAILURE)) 

整个代码很短,看起来如下:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define ERR(source) (perror(source),\ 
      fprintf(stderr,"%s:%d\n",__FILE__,__LINE__),\ 
      exit(EXIT_FAILURE)) 

int main(int argc, char** argv) { 
    char name[22]; 
    scanf("%21s",name); 
    if(strlen(name)>20) ERR("Name too long"); 
    printf("Hello %s\n",name); 
    return EXIT_SUCCESS; 
} 
+2

那么,这个宏的哪个部分是你难以理解的? – UnholySheep

+0

所有宏我不明白。我是C的新手。我不知道什么是ERR,然后下一部分(perror(源....),然后我不知道为什么会有反斜杠,那么__FILE __,__ LINE__很难让我理解 – hegendroffer

+0

' ERR'是宏的名称(这是代码定义的),'perror','fprintf'和所有其他东西都是C标准库的一部分,你可以在网上找到它们的定义,而反斜杠只是表示宏定义在下一行继续(所以你不必将所有东西都压缩成一行) – UnholySheep

回答

3

宏中的反斜杠意味着你可以读取下一行,就好像它是一条线,所以它归结为:

#define ERR(source) (perror(source), fprintf(stderr,"s:%d\n",__FILE__,__LINE__), exit(EXIT_FAILURE)) 

#define预处理语句用来代替与其它代码的代码,例如

#define SOMECONSTANT 5 

将在编译代码之前用5代替SOMECONSTANT。预处理器还可以理解类似于函数的语法,这就是你在这里所做的。

您的宏导致以下主体:

int main(int argc, char** argv) { 
    char name[22]; 
    scanf("%21s",name); 
    if(strlen(name)>20) (perror("Name too long"), fprintf(stderr,"s:%d\n",__FILE__,__LINE__), exit(EXIT_FAILURE)); 
    printf("Hello %s\n",name); 
    return EXIT_SUCCESS; 
} 

宏在您的情况使用逗号操作符把几个语句组合在一起,所以你可以使用它作为一个声明。通常,您的代码将写为:

int main(int argc, char** argv) { 
    char name[22]; 
    scanf("%21s",name); 
    if(strlen(name)>20) { 
      perror("Name too long"); 
      fprintf(stderr,"s:%d\n",__FILE__,__LINE__); 
      exit(EXIT_FAILURE); 
    } 
    printf("Hello %s\n",name); 
    return EXIT_SUCCESS; 
} 

希望您明白现在发生了什么。

+0

谢谢,我明白了一切:) – hegendroffer