gpt4 book ai didi

c++ - 以标准的方式在源代码中指明C++标准

转载 作者:可可西里 更新时间:2023-11-01 18:38:29 27 4
gpt4 key购买 nike

符合标准的 C++ 编译器定义了一个 __cplusplus可能的宏在预处理过程中进行检查以确定在什么标准下文件正在编译,例如:

#if __cplusplus < 201103L
#error "You need a C++11 compliant compiler."
#endif

#include <iostream>
#include <vector>

int main(){
std::vector<int> v {1, 2, 3};
for (auto i : v){
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}

我的问题是:

  • 是否有一种标准方式来指示来源的标准文件应该编译?

这将允许构建工具在编译之前检查源代码为 -std= 确定适当的参数(cf. shebang 是哪个可以指示脚本语言/版本:#!/usr/bin/env python3 ).

我能想到的一种非标准且脆弱的方法是寻找__cplusplus 的预处理器检查但在上面的例子中我可以也有写:

#if __cplusplus <= 199711L
#error "You need a C++11 compliant compiler."
#endif

因此,编写例如正则表达式将变得非常棘手以捕获所有变化。

编辑:

虽然我赞同@Gary 的回答,该回答建议依赖构建系统,它假定我们实际上将有一个构建步骤。

但你今天已经可以了:

  • 使用解释器运行 C++ 程序,例如CINT
  • 或使用来源到来源的翻译,例如rosecompiler

我的问题也是关于表明源是C++和什么版本它的目的是(想象有人在 70 年后挖掘出我的代码 当 C++ 可能像今天的 Cobol 一样流行时)。

我想我要寻找的等效物是 HTML 的 C++ 等效物: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

最佳答案

C++ 标准在某种程度上有点像针对库进行开发。从这个意义上说,库通常以一种在访问新功能的同时慢慢弃用旧功能的方式发展。典型的方法是引入新方法或签名,同时仍然允许访问旧方法或签名。

举个简单的例子,例如,您可以为 iPhone 制作一个向后兼容 IOS 4 及更高版本的应用程序。您无法选择要支持的特定版本。这很好,因为否则您会打开代码演进的可能性矩阵,使您的代码更难理解和维护。

或者,您可以引入预处理器指令来根据版本或某种标志有条件地构建某些片段。但是,这些是临时措施,应随着代码的发展而删除。

所以我认为按原样回答这个问题,更好的问题是问自己在这种情况下添加这样的东西实际上会解决什么问题,它会增加不必要的复杂性(糟糕设计的代码味道之一)吗?

在这种情况下,根据经验,我个人认为您最好坚持使用一种标准。我认为您会发现,尝试通过散布各种预处理器 #ifdef 和 #ifndefs 来区分标准将使理解您的代码库变得难以理解和管理。即使您有一个包含文件,其中定义了被所有其他文件包含的允许的版本,它也会成为另一个需要管理的文件……更不用说当您更改它时,您必须重新编译包含它的所有内容。

如果您担心有人使用错误的标准构建您的代码库,请使用不需要开发人员输入该信息的构建系统。例如 Make、Ant、cmake。它使您的软件构建变得简单,并清楚地定义了应该如何以可重复的方式编译项目。如果你走这条路,你会发现试图保护代码不被错误编译就不是问题了。

此外,如果他们不按自己的方式使用错误的标准进行编译,他们将遇到大量编译器错误 =)

关于c++ - 以标准的方式在源代码中指明C++标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26357687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com