![]() |
1
8
没有预处理器的主要语言通常有不同的、通常更干净的方法来实现相同的效果。
有一个文本预处理器,比如
C++常见问题解答 calls macros evil |
![]() |
2
8
预处理器的可移植性优势远远超过了被滥用的可能性。 以下是我在行业中看到的一些真实代码的示例:
硬币的另一面是 在预处理器中:
摘要 :通过使用语言机制(而不是文本替换)来隔离依赖于平台的代码,您可以公开 全部的 你的代码到编译器,每件事都得到类型检查,至少,你有机会做一些事情,如静态分析,以确保适当的测试覆盖率。您还排除了一大堆导致代码不可读的编码实践。 |
![]() |
3
6
你可以做:
您可能会得到相同或至少相似的代码输出。
|
![]() |
4
2
其他语言确实支持这个特性,通过使用一个通用的预处理器,比如m4。
|
![]() |
5
2
C预处理器可以在 任何 文本文件,不需要是C。 当然,如果在另一种语言上运行,它可能会以奇怪的方式进行标记化,但是对于像#ifdef DEBUG这样的简单块结构,您可以将其放在任何语言中,在其上运行C预处理器,然后在其上运行特定于语言的编译器,它就会工作。 |
![]() |
6
2
请注意,宏/预处理/条件/etc通常被视为编译器/解释器功能,而不是语言功能,因为它们通常完全独立于正式的语言定义,并且对于同一种语言,不同的编译器实现可能有所不同。
$if debug array x $endif ... $if debug dump x $endif 仅在需要x时声明/分配/编译x,而 array x boolean debug ... if debug then dump x 不管debug是否为true,可能都必须声明x。 |
![]() |
7
2
一个更好的问题是,为什么C使用预处理器来实现这些元编程任务?它不是一个功能,而是对当时技术的妥协。 C语言中的预处理器指令是在机器资源(CPU速度、RAM)匮乏(而且昂贵)的时候开发的。预处理器提供了一种在内存有限的低速机器上实现这些功能的方法。例如,我拥有的第一台机器有56KB的RAM和2Mhz的CPU。它仍然有一个完整的K&R C编译器可用,这将系统的资源推到了极限,但是可行的。 更现代的语言利用当今功能更强大的机器提供更好的方法来处理前处理器用来处理的各种元编程任务。 |
![]() |
8
1
非常强大 (实际上是图灵完整的)宏系统,那么他们为什么要把自己局限于蹩脚的CPP风格的宏,而这些宏甚至不是真正的宏,只是文本片段? 其他具有强大语法元编程的语言包括Io、Ioke、perl6、OMeta和Converge。 |
![]() |
9
0
因为减小二进制文件的大小:
|
![]() |
10
0
其他语言也有更好的动态绑定。例如,由于出口原因,我们有些代码无法发送给某些客户。我们的“C”库使用
Java代码使用插件(alaeclipse),所以我们不需要发布这些代码。
|
![]() |
11
0
另外一点没人提到,就是平台支持。 大多数现代语言不能运行在与C或C++相同的平台上,也不打算在这个平台上运行。例如,Java、Python和C等本地编译语言都需要一个堆,它们被设计为在具有内存管理、库和大量空间的操作系统上运行,而不是在独立的环境中运行。在那里,您可以使用其他方法来存档相同的文件。C可以用来编程控制器与2kibrom,那里你需要一个预处理器为大多数应用程序。 |
![]() |
Sudhanva c · 如何提高编码技能?[已关闭] 7 年前 |
![]() |
hoffm · 为什么Ruby找不到调用方类中定义的常量? 7 年前 |
![]() |
Thamme Gowda · “lambda”关键字的较短替代项? 8 年前 |
![]() |
AlphaModder · 有没有带有“不寻常”访问修饰符的编程语言? 10 年前 |
|
lucasasecas · 有可能静态地使用动态语言吗? 10 年前 |
|
Eugenio Laghi · 仅由括号、加号和感叹号组成的语言 10 年前 |
![]() |
dallin · 数组中的逗号运算符是否有名称? 11 年前 |