当使用Debian GCC版本4.7.2中的#if-windows/#if-linux编译器功能时,我在使用std11时无法使它们正常工作。
独立地,我可以让编译器毫无怨言地接受if定义。我还可以让编译器使用与c++11相同的代码,不需要任何if定义(因此没有条件)。但是,当我通过相同的编译器运行带有c++11标记的条件定义时,代码会被拒绝。
下面我包括了一个简单的例子,有两个备用电源,以及我得到的错误。两条干线之间的唯一区别是注释掉的线路。
运行次数:
g++ main.cpp -std=c++11 -o test
上面使用的是c++11标准。当运行comment main时,它可以完美地工作。但是当运行未注释的main时,它完全失败了,在本文的最后给出了错误。
g++ main.cpp -o test
以上内容未使用c++11标准。当运行注释的main或未注释的main[/b>时,它可以完美地工作。
以下是代码示例。
注释main.cpp:
#include <iostream>
//#if windows
//#include "WindowsSolution.hpp"
//#endif
//#if linux
#include "LinuxSolution.hpp"
//#endif
int main()
{
std::cout << myGlobalSolution.out() << std::endl;
return 0;
}
LinuxSolution.hpp:
class LinSolution{
public:
LinSolution(){
}
std::string out(){
std::string ret("Linux solution");
return ret;
}
};
LinSolution myGlobalSolution;
WindowsSolution.hpp:
class WinSolution{
private:
WinSolution(){
}
std::string out(){
std::string ret("Windows solution");
return ret;
}
};
WinSolution myGlobalSolution;
未注释的main.cpp:
#include <iostream>
#if windows
#include "WindowsSolution.hpp"
#endif
#if linux
#include "LinuxSolution.hpp"
#endif
int main()
{
std::cout << myGlobalSolution.out() << std::endl;
return 0;
}
下面是我在使用c++11标志使用未注释的main.cpp进行编译时得到的错误。
main.cpp: In function ‘int main()’:
main.cpp:13:15: error: ‘myGlobalSolution’ was not declared in this scope
简单常量linux
是GCC的扩展,而不是官方的OS常量。Debian的适当常数可能是__gnu_linux__
;你可以在这里找到各种系统的列表。通常,官方预定义的常量遵循在开始时使用__
的惯例。
您的代码在没有标准标志的情况下工作,因为默认情况下GCC以GNU语言模式(GNUC++)而不是标准语言模式(ISO C++)进行编译;GNU语言包括扩展(额外的语言特性,在本例中是遗留的OS常量)。当您传递-std=c++11
标志时,您正在请求ISO语言模式,这意味着GNU扩展被禁用,包括仅GNU常量。要获得GNU扩展和一组特定的ISO功能,请尝试请求GNU语言标准版本(例如-std=gnu++11
运行良好)。