一种可行的语言需要预处理器吗? C++预处理器有多有用?即使在C#中,它仍然有一些功能,但我一直在考虑完全放弃它的使用,转而使用一种假设的未来语言。我想有些语言,比如Java,在没有这样的东西的情况下仍然存在。没有预处理步骤的语言是否具有竞争力和可行性?在没有预处理器的情况下,用语言编写的程序会采取哪些步骤来模拟其功能,例如调试和发布代码的不同代码,以及这些步骤与#ifdef debug相比如何?

一种可行的语言需要预处理器吗? C++预处理器有多有用?即使在C#中,它仍然有一些功能,但我一直在考虑完全放弃它的使用,转而使用一种假设的未来语言。我想有些语言,比如Java,在没有这样的东西的情况下仍然存在。没有预处理步骤的语言是否具有竞争力和可行性?在没有预处理器的情况下,用语言编写的程序会采取哪些步骤来模拟其功能,例如调试和发布代码的不同代码,以及这些步骤与#ifdef debug相比如何?,c++,c-preprocessor,language-design,C++,C Preprocessor,Language Design,我想说不,一种语言不需要宏就可以生存和竞争 这并不意味着在某些语言中不需要宏 如果您需要宏,可能是因为您的语言存在缺陷。(或者因为你试图兼容其他一些不足的语言,比如C++和C:)。让语言“足够好”,你将很少需要宏,以至于语言可以不需要宏 当然,这取决于你的语言的目标是什么“足够好”实际上意味着什么,以及宏是否是实现某些事情的好方法,或者仅仅是对缺失的概念/特征的帮助。 即使是在一种“足够好”的语言中,也可能会有一段奇怪的时间,你希望宏出现在那里。也许它们仍然值得拥有。也许不是。这取决于它们给语言

我想说不,一种语言不需要宏就可以生存和竞争

这并不意味着在某些语言中不需要宏

如果您需要宏,可能是因为您的语言存在缺陷。(或者因为你试图兼容其他一些不足的语言,比如C++和C:)。让语言“足够好”,你将很少需要宏,以至于语言可以不需要宏

当然,这取决于你的语言的目标是什么“足够好”实际上意味着什么,以及宏是否是实现某些事情的好方法,或者仅仅是对缺失的概念/特征的帮助。 即使是在一种“足够好”的语言中,也可能会有一段奇怪的时间,你希望宏出现在那里。也许它们仍然值得拥有。也许不是。这取决于它们给语言带来了什么,以及它们在复杂性方面(对编译器/运行时和程序员)带来了什么问题。但任何语言特征都是如此。你不会设计一种旨在“拥有每一个特性”的语言,因此你必须根据权衡和好处进行选择

<> P>模板是C++中一个非常强大的特性,我在C中偶然发现了一些东西,但是C应该有吗?每种语言都应该有这个特点吗?考虑到它们带来的复杂性(以及您通常可以使用C++/CLI进行此类工作的事实),可能不会


顺便说一句,我不是说“任何好的语言都没有宏”;我只是说一门好的语言不需要它们。而FWIW,Java没有它们曾经让我恼火,但这可能是因为Java在某些领域缺乏它们,而不是因为宏是必不可少的。

实现条件编译不需要预处理步骤。您并不真正需要宏(没有stringize和token-paste操作符也可以使用宏,即使没有PP也可以使用宏)#includes是一种非常特殊的噩梦,它对引用调用进行了错误的建模


还有什么这么重要呢?

事实上,大多数语言在没有预处理器的情况下处理得非常好。我想继续说,将预处理器与C/C++结合使用的必要性源于它们缺乏几个部分的功能

例如:

assert(ptr!=0);
  • 大多数语言不需要头文件,并且包含保护,因为它们有“模块”的概念
  • 通过
    static if
    s或类似机制,可以很容易地获得条件编译
  • 与使用预处理器相比,代码重复几乎总是可以以更清晰的方式减少:使用模板/泛型、反射系统等
因此,我的结论是:对于通过预处理器和元编程可以获得的大多数“功能”,存在一种更清晰的替代方案,它更安全,使用更方便。


D编程语言,作为一种编译的低级语言,是一个很好的例子,“如何提供通常通过预处理器完成的大多数功能,而不进行实际预处理”-包括我提到的所有内容,加上字符串混合和模板混合,还有一些聪明的解决方案通常用C/C++中的预处理来解决。

< P>这将取决于你认为可行的,但是 在C++中,使用宏的必要性/可取性已经被诸如模板、内联和命名空间等特征所消除。我发现自己在C++中使用宏的唯一原因是与C(在头文件和处理定义中的μi IFDEFα-cPLUPLUS)集成。对于其他语言,使用JNI或SWIG之类的工具生成C头/库时,这是不必要的

与其使用宏来控制“debug”和“nodebug”构建,不如让编译器包含一个debug编译选项来包含/启用必要的功能


有几种语言没有宏就可以工作;如果您正在寻找一种类似C的语言来进行比较,我建议D

非常有用,但使用时应小心

你需要的例子很少

  • 目前没有其他标准方法来正确处理
    #包括
    ,而不是将处理器作为标准的一部分。您还需要
    定义
    以包含防护装置。但是这是C++语言中不存在的其他语言的特定问题。
  • 处理器对于条件编译非常有用当您需要将系统配置为使用不同的API、不同操作系统的不同工具包时,这是唯一的方法(除非您希望创建抽象接口,然后在构建系统级别进行条件编译)
  • 在不使用可变模板的情况下,用当前C++标准(2003),在某些情况下,生命变得容易得多。例如,当您需要创建一组类时,如:

    template<typename R>
    class function<R()> { ... }
    template<typename R,typename T1>
    class function<R(T1)> { ... }
    template<typename R,typename T1,typename T2>
    class function<R(T1,T2)> { ... }
    ...
    
    打印时会中止程序打印:

    在foo.cpp第134行“ptr!=0”中的断言失败

    当然,它对单元测试非常有用:

    TEST(3.14159 <=pi && pi < 3.141599);
    
    TEST(3.14159)“我想有些像Java这样的语言没有这样的东西也能生存下来。没有预处理步骤的语言有竞争力吗?”Java是有竞争力的和可行的,如果有点过时的话。你回答了自己的问题。
    \ifdef
    与消除死代码的编译器相比有什么优势?@John:
    E
    
    if(should_log(info))
       log(info) << "this is the message in file foo.cpp, line 10, foo::doit()" << "Value is " << x;
    
    LOG_INFO() << "Value is " << x;