符合标准的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&#39; s
可以指示脚本语言/版本:#!/usr/bin/env python3
)。
我能想到的非标准和脆弱的方式是寻找
预处理器检查__cplusplus
,但在上面的例子中,我可以
也写了:
#if __cplusplus <= 199711L
#error "You need a C++11 compliant compiler."
#endif
因此,编写例如一个正则表达式会变得非常棘手,以捕捉所有变化。
修改
虽然我同情@Gary的回答,建议依赖于构建系统, 它假定我们实际上将有一个构建步骤。
但你今天已经可以了:
我的问题也是关于表明源是C ++和什么版本 它的目的是(想象有人在70年后挖掘我的代码 当C ++可能像Cobol今天那样受欢迎时。)
我想我要找的同样的东西是HTML的C ++ equiavlent:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
答案 0 :(得分:3)
C ++标准在某种程度上有点像针对库进行开发。从这个意义上说,库通常以一种在访问新功能的同时慢慢弃用旧功能的方式发展。典型的方法是引入新方法或签名,同时仍然允许访问旧方法或签名。
举个简单的例子,您可以为iPhone制作一个向后兼容IOS 4及更高版本的应用程序。您无法选择要支持的特定版本。这很好,因为否则你会打开代码演变到可能性的矩阵,使你的代码更难理解和维护。
或者,您可以引入预处理程序指令,根据某种版本或标志有条件地构建某些部分。但是,这些是临时措施,应随着代码的发展而删除。
所以我认为,对于回答这个问题,更好的问题是在这种情况下问自己是什么会增加这样的东西实际解决并且会增加不必要的复杂性(一个代码味道糟糕的设计)?
在这种情况下,从经验来看,我个人认为你最好坚持一个标准。我认为您会发现,尝试通过使用各种预处理器#ifdef和#ifndefs来区分标准将会使理解您的代码库难以理解和管理。即使你有一个包含文件,其中包含所有其他文件包含的允许版本的定义,它也成为另一个要管理的文件....更不用说当你更改它时,你必须重新编译包含它的所有内容。
如果您担心某人使用错误的标准构建代码库,请使用不需要开发人员输入该信息的构建系统。例如Make,Ant,cmake。它使您的软件构建变得简单明了,定义了如何以可重复的方式编译项目。如果你走这条路,你会发现试图保护代码不被编译不成为一个问题。
此外,如果他们不顾一切地使用错误的标准进行编译,他们会受到大量编译错误的欢迎=)