代码之家  ›  专栏  ›  技术社区  ›  cdmckay

为什么预处理器在C/C++/ObjC以外的语言中不太常见?

  •  11
  • cdmckay  · 技术社区  · 16 年前

    12 回复  |  直到 16 年前
        1
  •  13
  •   Dima    16 年前

    预处理器最初是C语言所必需的,原因有几个。如果我没记错的话,原来C没有常量,所以 #define #定义 #ifdef 条件编译需要s。编译器通常不够聪明,无法优化掉无法访问的代码,所以,再一次, #ifdef

    在C++中使用预处理器是可接受的甚至是必要的少数情况下, #ifdef __cplusplus __FILE__ __LINE__

    C++ Gotchas

        2
  •  10
  •   Greg Hewgill    16 年前

    Java、C#或Scala中没有使用预处理器的原因是这些语言显然没有预处理器。

    C预处理器的一个常见用途是帮助提供特定于平台的代码。由于C(这里包括C++和Objective-C)是一种需要直接与操作系统交互的低级语言,因此在可移植代码中,必须为不同的操作系统编译不同的代码段。您可以在成熟、高度可移植的代码库中找到这类事情的大量示例,例如 zlib .

    #ifdef WIN32
        closesocket(s);
    #else
        close(s);
    #endif
    

    预处理器还提供了一种在C中定义常量的方法,这些常量由新语言中其他更好的语言特性提供。

        3
  •  9
  •   Norman Ramsey    16 年前

    接口或实现没有语言构造。因为不同的.c文件共享一个接口视图至关重要,所以编程规程演变为将声明(即接口)放入.h文件中,并使用文本包含共享这些声明/接口( #include ).原则上, #define #ifdef

    源代码分析 调试

        5
  •  3
  •   rp.    16 年前

        6
  •  1
  •   Community Mohan Dere    9 年前

    预处理在Java世界中非常普遍。它用于弥补该语言缺乏足够的内置抽象设施,否则会导致无休止的复制和粘贴样板代码。

        7
  •  1
  •   Brian Postow    16 年前

        8
  •  1
  •   Jim Ferrans    16 年前
        9
  •  1
  •   Porculus    16 年前

    我认为这是一个单独的工具,因为编译器不是我们今天所知道的一种工具。我听说,非常古老的C编译器过去常常将令牌生成到文件中,然后在单独的阶段进行其余的编译。我能想到的主要原因是,与我们今天所拥有的相比,内存和其他资源非常稀缺。

        10
  •  0
  •   JDonner    16 年前

        11
  •  0
  •   Chris Simmons    16 年前

    source filters ,它们基本上是用Perl编写的自定义Perl预处理器:)

        12
  •  0
  •   OscarRyz    16 年前

    C#复制(或继承)了Java的大部分设计决策。

    高级编程语言避免了这种低级工件。