GCC C++11无法查看#if windows和#if linux(重新询问)

GCC C++11 Fails to See #if windows And #if linux (Re-ask)

本文关键字:#if linux 新询问 windows GCC C++11      更新时间:2023-10-16

当使用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运行良好)。