C中预处理器的复杂语法

时间:2016-11-02 16:03:01

标签: c stdout stdin stderr

我试图找出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;
}

1 个答案:

答案 0 :(得分:3)

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

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

#define预处理程序语句用于将代码替换为其他代码,例如

#define SOMECONSTANT 5
在编译代码之前,

会将代码中的SOMECONSTANT替换为5。预处理器也理解类似函数的语法,这就是你在这里所拥有的。

您的宏会产生以下主体:

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

希望您了解现在发生的事情。