【问题标题】:A complicated syntax over preprocessor in CC中预处理器的复杂语法
【发布时间】:2016-11-02 16:03:00
【问题描述】:

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

【问题讨论】:

  • 那么你在理解这个宏的哪个部分有困难?
  • 所有的宏我都看不懂。我是C语言的新手。不知道什么是ERR,然后下一部分(perror(source....)然后不知道为什么有反斜杠,然后是FILE,LINE对我来说很难理解
  • ERR 是宏的名称(这是代码定义的),perrorfprintf 和所有其他东西都是 C 标准库的一部分,你可以找到他们的在线定义。而反斜杠仅表示宏定义在下一行继续(因此您不必将所有内容都限制在一行中)
  • @hegendroffer: __FILE____LINE__ 是宏,将扩展到当前文件/翻译单元和当前行号。快速goolge search would've told you

标签: c stdout stdin stderr


【解决方案1】:

宏中的反斜杠表示你可以像读一行一样读取下一行,所以归结为:

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

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

【讨论】:

  • 谢谢你,我明白了:)
猜你喜欢
  • 2016-09-16
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多