使用-std = c ++ 0x标志进行编译时,Unix宏变为未定义

时间:2018-01-03 10:30:29

标签: c++ gcc

使用 -std = c ++ 0x 标记编译下面的代码时, unix 宏变为未定义且错误“Unix未定义!”显示。是否有任何理由发生这种情况以及如何解决这个问题?已在gcc 4.7.2和4.8.4版本中验证。

#include <iostream>

#if !defined(unix)
#error Unix is not defined!
#endif

int main()
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}

2 个答案:

答案 0 :(得分:10)

从GCC手册3.7.3 System-specific Predefined Macros

  

C标准要求所有特定于系统的宏都是保留命名空间的一部分。所有以两个下划线或下划线和大写字母开头的名称都保留给编译器和库以供其使用。但是,历史上系统特定的宏具有没有特殊前缀的名称;例如,在Unix系统上定义unix是很常见的。对于所有这些宏,GCC提供了一个并行宏,在开头和结尾添加了两个下划线。如果定义了unix,则也会定义__unix__。永远不会超过两个下划线; _mips的并行是__mips__

     

当向编译器提供请求严格一致性的-ansi选项或任何-std选项时,将禁止保留命名空间之外的所有特定于系统的预定义宏。保留命名空间内的并行宏仍然是定义的。

特别注意第二段。

<强> TL;博士

unix宏不符合标准,__unix__是。当您向编译器询问-std=c++0x时,它切换到“严格一致性”,其中只有__unix__可用(并且默认支持的“扩展名”unix被删除)。

答案 1 :(得分:3)

正如其他人所说'unix'是标准的gcc扩展,并且通过指定public class PropertyManager { private Dictionary<ElementPropertyKey, string> _values = new Dictionary<ElementPropertyKey, string>(); private string[] _values2 = new string[1]; private List<string> _values3 = new List<string>(); public PropertyManager() { _values[new ElementPropertyKey(5, 10, "Property1")] = "Value1"; _values2[0] = "Value2"; _values3.Add("Value3"); } public ref string GetPropertyValue(ElementPropertyKey key) { return ref _values[key]; //Does not compile. Error: An expression cannot be used in this context because it may not be returned by reference. } public ref string GetPropertyValue2(ElementPropertyKey key) { return ref _values2[0]; //Compiles } public ref string GetPropertyValue3(ElementPropertyKey key) { return ref _values3[0]; //Does not compile. Error: An expression cannot be used in this context because it may not be returned by reference. } } ,你告诉它使用标准。您可以改为--std=c++0x并保留扩展名(或使用其他人建议的--std=gnu++0x