【问题标题】:What features of C++ are not compatible with compilers other than Visual Studio?C++ 的哪些功能与 Visual Studio 以外的编译器不兼容?
【发布时间】:2010-06-25 21:28:49
【问题描述】:

有人告诉我要避免使用 C++ 的这些特性,因为这会使代码难以移植到其他编译器。

给出的示例是在我的头文件中使用#ifdef 而不是#pragma once

【问题讨论】:

  • 你知道你想针对哪些其他编译器吗?并在哪些平台上运行? (32 位 vs 64 位?Unix/Linux vs Windows?)

标签: visual-c++ language-features portability


【解决方案1】:

嗯,这很难回答,因为每个编译器都是不同的 - 更具体地说,#pragma 语句不是 C++ 的特性。 #pragma 的定义是“发送给编译器的命令”:

“根据定义,编译指示是特定于机器或操作系统的,并且通常对于每个编译器都不同。” MSDN

因此,本质上,每当您看到 #pragma 时,它的意思是“接下来的内容不是语言标准的一部分,因此对于您的目标/编译平台而言可能会有所不同”

【讨论】:

    【解决方案2】:

    那些不是“C++特性”,它们是编译器开发者提供的非标准“扩展”、非标准函数和“编译器特性”。

    在移植过程中会导致问题的 Microsoft 特定功能的简短且不完整的列表:

    1. 编译指示一次。 (几乎每个编译指示)将被另一个编译器忽略,这将导致多个头文件包含。可能会引起麻烦。

    2. __int32 和类似类型(特定于微软)
    3. 来自 windows.h 的所有内容 - DWORD/WORD/HANDLE/TCHAR。还有特定于操作系统的 API 和系统调用。这包括 WinMain()。
    4. 以两个下划线开头的每个内置类型、宏和关键字(____FUNCTION____、__int32、__declspec 等)。
    5. *printf 函数的某些版本 - swprintf、vswprintf 等。某些格式 (%S) 规范在不同编译器上的行为不同。
    6. *_s 函数(strcpy_s 等)。

    【讨论】:

      【解决方案3】:

      这是 VC++ 中的非标准行为列表:http://msdn.microsoft.com/en-us/library/x84h5b78%28VS.71%29.aspx

      【讨论】:

        【解决方案4】:

        非常干净但不可移植的for each, in 语句:Visual c++ "for each" portability

        【讨论】:

          猜你喜欢
          • 2012-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-19
          • 2012-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多