当前位置: 首页 > 知识库问答 >
问题:

如果一个旧的C编译器没有实现一个新的关键字,那么定义它是错误的吗?

范浩荡
2023-03-14

我正在维护一个仍然支持旧编译器的库,其中一个是视窗上的Visual C 2013。到目前为止,我们一直非常保守,坚持使用C 03;我们现在正在转向C 11。VC 2013支持大多数较新的功能,但它不识别no,除了

当然,将其添加到代码中的规范方法是定义以下内容

#if (the compiler does not support it)
    #define NOEXCEPT
#else
    #define NOEXCEPT noexcept
#endif

然后用它就像

void f() NOEXCEPT;

当然,缺点是我们在代码周围散布宏。

然而,我突然想到(可能是我肩上的一个小守护魔鬼建议的),我也可以写作

#if (the compiler does not support it)
    #define noexcept
#endif

之后我就可以写作了

void f() noexcept;

编译器将正确使用关键字,并在旧编译器上定义。

这是有效的(比如编译成功),但是,嗯,我觉得有点脏——我不确定我应该这么做。当然,定义一个关键字的标准禁止定义它;但是如果编译器不完全支持这个标准,还是我处于某种灰色地带?

共有1个答案

应翰飞
2023-03-14

因为它在旧标准中不是一个关键字,所以在针对旧标准时,您是,而且在技术上仍然可以定义这样的宏。

P. S. pre-C11的典型定义是使用投掷()代替no除外

P.P.S.请注意,在noexcept的情况下,宏不适用于以下声明:

void foo() noexcept(false);
bool bar = noexcept(foo());

因此,这些语句不能如此容易地向后兼容。鉴于无法支持noexcept的所有用例,对宏使用不同的名称可能有助于避免混淆。

 类似资料:
  • 我正在用Gradle编译一个Java项目。当我运行时,我得到: 任务:CompileJava失败/home/mvh/projects/research/dpm/src/main/java/dpm/bandera/bandera.java:102:错误:从1.4版起,“assert”是一个关键字,不能用作标识符public static void assert(boolean expr){^(use

  • 在index.hpp中,我创建了一个具有多个数据成员的类,如、等。我在类外部定义了一个构造函数。在program.cpp中,我创建了一个名为SAM的对象。当我试图编译它时,它显示错误。什么原因? Program.cpp index.hpp 错误信息

  • 本文向大家介绍如果hashMap的key是一个自定义的类,怎么办?相关面试题,主要包含被问及如果hashMap的key是一个自定义的类,怎么办?时的应答技巧和注意事项,需要的朋友参考一下 考点:集合 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。

  • 这是我的代码: 代码编译时没有任何编译器错误。为什么它不会有编译错误呢。类C与引用类型类D和实际的类类型B没有任何关系。它是如何通过类型转换的编译器检查的?

  • 我试图用Selenium×Node.js实现自动化测试,但它在调查阶段被阻止了... Mac OS10.12.6 节点8.11.1 Selenium Server 3.12.0 Selenium WebDriver 4.0.0 ChromeDriver 2.38 3.安装selenium-server 通过自制安装 4.安装ChromeDriver $selenium-server-port 44

  • 问题内容: 我们将注释定义为接口,如下所示 而且我们知道所有注释默认都会扩展接口。 当我检查接口的Java库时,我发现它覆盖了Object类等许多方法。 如果Annotation是一个接口,那么它如何扩展Object类并覆盖其方法?接口只能扩展其他接口,不能扩展类。 问题答案: 所以我的问题是,如果Annotation是一个接口,那么它将如何扩展Object类并覆盖其方法 不完全是。Java语言规