【发布时间】:2014-10-14 09:48:59
【问题描述】:
符合标准的 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's which
可以指明脚本语言/版本:#!/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">
【问题讨论】:
-
出于兴趣,你为什么要关心?如果您编写可在 98 中编译的代码,它应该在 03 或 11 中可编译(您可能正在使用已弃用的函数 - 可能),但它应该编译 - 那么目的是什么?
-
@Nim 我猜这是关于文件请求的最低版本。
-
@leemes,让我换个方式问这个问题,如果一个文件说它可以用 98 编译,
std=是否会更改为该文件的那个?如果不是,那么这种方法没有意义恕我直言,在项目级别决定您使用哪个版本,并可能检查文件以处理旧编译器(如果它太旧则拒绝......) -
@Nim 我有一个构建脚本,我想自动检测我的源代码是否使用 C++11,所以我不必关心设置适当的 -std 标志。通常你可以强制执行编译器的最新标准,例如
-std=c++11但严格来说,C++11 标准有一些向后不兼容的变化。总的来说,我认为它作为文档很好(例如,C++ 标头通常以 '.h' 结尾,因此除非您手动检查它们,否则 C 标头可能会有些混淆) -
有一个标准化功能请求的提案,看看here。
标签: c++ c++11 compilation