一种可行的语言需要预处理器吗? C++预处理器有多有用?即使在C#中,它仍然有一些功能,但我一直在考虑完全放弃它的使用,转而使用一种假设的未来语言。我想有些语言,比如Java,在没有这样的东西的情况下仍然存在。没有预处理步骤的语言是否具有竞争力和可行性?在没有预处理器的情况下,用语言编写的程序会采取哪些步骤来模拟其功能,例如调试和发布代码的不同代码,以及这些步骤与#ifdef debug相比如何?
我想说不,一种语言不需要宏就可以生存和竞争 这并不意味着在某些语言中不需要宏 如果您需要宏,可能是因为您的语言存在缺陷。(或者因为你试图兼容其他一些不足的语言,比如C++和C:)。让语言“足够好”,你将很少需要宏,以至于语言可以不需要宏 当然,这取决于你的语言的目标是什么“足够好”实际上意味着什么,以及宏是否是实现某些事情的好方法,或者仅仅是对缺失的概念/特征的帮助。 即使是在一种“足够好”的语言中,也可能会有一段奇怪的时间,你希望宏出现在那里。也许它们仍然值得拥有。也许不是。这取决于它们给语言带来了什么,以及它们在复杂性方面(对编译器/运行时和程序员)带来了什么问题。但任何语言特征都是如此。你不会设计一种旨在“拥有每一个特性”的语言,因此你必须根据权衡和好处进行选择 <> P>模板是C++中一个非常强大的特性,我在C中偶然发现了一些东西,但是C应该有吗?每种语言都应该有这个特点吗?考虑到它们带来的复杂性(以及您通常可以使用C++/CLI进行此类工作的事实),可能不会一种可行的语言需要预处理器吗? C++预处理器有多有用?即使在C#中,它仍然有一些功能,但我一直在考虑完全放弃它的使用,转而使用一种假设的未来语言。我想有些语言,比如Java,在没有这样的东西的情况下仍然存在。没有预处理步骤的语言是否具有竞争力和可行性?在没有预处理器的情况下,用语言编写的程序会采取哪些步骤来模拟其功能,例如调试和发布代码的不同代码,以及这些步骤与#ifdef debug相比如何?,c++,c-preprocessor,language-design,C++,C Preprocessor,Language Design,我想说不,一种语言不需要宏就可以生存和竞争 这并不意味着在某些语言中不需要宏 如果您需要宏,可能是因为您的语言存在缺陷。(或者因为你试图兼容其他一些不足的语言,比如C++和C:)。让语言“足够好”,你将很少需要宏,以至于语言可以不需要宏 当然,这取决于你的语言的目标是什么“足够好”实际上意味着什么,以及宏是否是实现某些事情的好方法,或者仅仅是对缺失的概念/特征的帮助。 即使是在一种“足够好”的语言中,也可能会有一段奇怪的时间,你希望宏出现在那里。也许它们仍然值得拥有。也许不是。这取决于它们给语言
顺便说一句,我不是说“任何好的语言都没有宏”;我只是说一门好的语言不需要它们。而FWIW,Java没有它们曾经让我恼火,但这可能是因为Java在某些领域缺乏它们,而不是因为宏是必不可少的。实现条件编译不需要预处理步骤。您并不真正需要宏(没有stringize和token-paste操作符也可以使用宏,即使没有PP也可以使用宏)#includes是一种非常特殊的噩梦,它对引用调用进行了错误的建模
还有什么这么重要呢?事实上,大多数语言在没有预处理器的情况下处理得非常好。我想继续说,将预处理器与C/C++结合使用的必要性源于它们缺乏几个部分的功能 例如:
assert(ptr!=0);
- 大多数语言不需要头文件,并且包含保护,因为它们有“模块”的概念
- 通过
s或类似机制,可以很容易地获得条件编译static if
- 与使用预处理器相比,代码重复几乎总是可以以更清晰的方式减少:使用模板/泛型、反射系统等
D编程语言,作为一种编译的低级语言,是一个很好的例子,“如何提供通常通过预处理器完成的大多数功能,而不进行实际预处理”-包括我提到的所有内容,加上字符串混合和模板混合,还有一些聪明的解决方案通常用C/C++中的预处理来解决。 < P>这将取决于你认为可行的,但是 在C++中,使用宏的必要性/可取性已经被诸如模板、内联和命名空间等特征所消除。我发现自己在C++中使用宏的唯一原因是与C(在头文件和处理定义中的μi IFDEFα-cPLUPLUS)集成。对于其他语言,使用JNI或SWIG之类的工具生成C头/库时,这是不必要的 与其使用宏来控制“debug”和“nodebug”构建,不如让编译器包含一个debug编译选项来包含/启用必要的功能
有几种语言没有宏就可以工作;如果您正在寻找一种类似C的语言来进行比较,我建议D非常有用,但使用时应小心 你需要的例子很少
#包括,而不是将处理器作为标准的一部分。您还需要定义
以包含防护装置。但是这是C++语言中不存在的其他语言的特定问题。
在不使用可变模板的情况下,用当前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;