【问题标题】:Are typedef's handled by the preprocessor? [duplicate]typedef 是否由预处理器处理? [复制]
【发布时间】:2023-03-18 07:10:01
【问题描述】:

typedef 是否由 C 的预处理器处理?

typedef int foo_t;#define foo_t int一样吗?

【问题讨论】:

  • 一句话:没有。 (哎呀,这对 SO cmets 来说太短了)
  • @Barmar 这就是我的想法,但我想我想知道typedefs 背后的机制以及编译器如何处理它们。
  • @ameyCU 我承认,这个问题与我的非常相似。我会让社区决定是否应该关闭它。
  • @ameyCU 我知道,我只是在发表声明。我在发布之前查找了此问题的副本,但我没有看到那个。
  • typedef 被视为存储类说明符(与externstaticautoautoregister 一起)出于语法目的,尽管它不是真正的 存储类。它只是表明,它不是声明T 类型的对象,而是声明T 类型的同义词

标签: c c-preprocessor typedef


【解决方案1】:

不,因为这种替换类型不适用于更复杂的类型。例如:

typedef int tenInts[10];
tenInts myIntArray;

myIntArray的声明相当于:

int myIntArray[10];

要以宏的形式执行此操作,您必须将其设为函数样式,以便它可以在扩展的中间插入变量名。

#define tenInts(var) int var[10]

并像这样使用它:

tenInts(myIntArray);

这也不适用于声明多个变量。你必须写

tenInts(myArray1);
tenints(myArray2);

你不会写

tenInts myArray1, myArray2;

您可以使用typedef

【讨论】:

  • 请注意typedef int[10] tenInts; 不会编译
  • @ian5v 很好。它实际上可以使用函数式宏来完成。我已经更新了答案。
【解决方案2】:

否 - C 预处理器不处理 typedef。 C 预处理器无法识别 C 语言的语法;它不会知道什么是 typedef,什么不是 typedef。

#define 严格来说是“foo_t”的“int”的文本替换;预处理器完成的替换发生在编译之前。

【讨论】:

    【解决方案3】:

    不,typedef(作为 C 关键字)由编译器解释,而不是由预处理器解释,而 #define 由预处理器处理。

    【讨论】:

      【解决方案4】:


      举个例子,

      typedef int *int_ptr1;
      #define int_ptr2  int *
      

      然后在:

      int_ptr1 a, b;
      int_ptr2 c, d;
      

      ab 都是指向int 的指针。 c 也是指向 int 的指针,但 dint

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-02
        • 2012-02-07
        • 2011-01-01
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 2011-08-26
        相关资源
        最近更新 更多