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