【问题标题】:Use #define preprocessor directive in a weird way以一种奇怪的方式使用#define 预处理器指令
【发布时间】:2011-04-22 08:52:05
【问题描述】:

今天刚看完C上关于如何使用#define创建一个manifest常量的阅读和实验,然后想到了一些东西,下面是代码。

#include <stdio.h>
#define dummy main
#define yam {
#define apple }

int dummy(void)        //constant substitution main with dummy
yam                          // constant substitution { with yam
  printf("It works!!\n");
  return 0;
apple                           //constant substitution } with apple

正如预期的那样,它就像魅力一样,我只是想知道为什么这样的事情没有导致任何错误,也许我可以理解为什么 main() 可以被替换,因为 main 是一个标识符(给函数的名称, 变量和常量),但是为什么{} 也可以用符号名代替呢?第二件事是,C 使用什么数据类型来存储这个符号常量,它不是用单引号 "" 括起来的字符,也不是整数或浮点数。

【问题讨论】:

  • 看在所有神圣事物的份上,不要以如此糟糕的方式滥用预处理器!
  • 哈哈@Philip,我只是对它感到好奇,所以我这样做了,我不认为我不会用这种方法编写任何软件
  • 那么,文本 { 和 } 存储在什么数据类型中?因为我没有用单引号括起来

标签: c c-preprocessor identifier


【解决方案1】:

#define 语句由预处理器评估在程序实际编译之前,因此编译器永远不会看到yam。预处理器执行直接文本替换。

也就是说,当编译器看到你的代码时,是这样的:

int main(void)        //constant substitution main with dummy
{                          // constant substitution { with yam
  printf("It works!!\n");
  return 0;
}                           //constant substitution } with apple

【讨论】:

    【解决方案2】:

    定义实际上是文本替换。在预处理步骤中,编译器将遍历您的代码并将所有dummy 替换为main,将yam 替换为{,将apple 替换为}

    【讨论】:

      【解决方案3】:

      这是可行的,因为预处理器是一个 *PRE* 处理器,即它是在真正处理之前发生的事情。

      因此,在真正的编译器开始查看代码之前,预处理器会进行粗略的文本替换。

      【讨论】:

        【解决方案4】:

        #define 由预处理器处理。在编译器编译代码之前,这些东西将被逐个字符地替换。您基本上可以使用#define 来隐藏您的整个代码,但是任何拥有预编译器的人都可以稍后将其隐藏。预处理器会替换所有出现的您定义的“常量”,除非它包含在引号中(例如,char *test="dumy yam apple"; 将保持不变)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-29
          • 2021-08-11
          • 2019-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-17
          • 2020-01-22
          相关资源
          最近更新 更多