C ++的哪些功能与Visual Studio以外的编译器不兼容?

时间:2010-06-25 21:28:50

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

我被告知要避免使用像这样的C ++功能,因为它很难将代码移植到其他编译器。

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

4 个答案:

答案 0 :(得分:3)

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

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

所以,基本上,只要你看到#pragma,就意味着“接下来的内容不是语言标准的一部分,因此对于你定位/编译的每个平台都可能有所不同”

答案 1 :(得分:3)

这些不是“C ++特性”,它们是非标准的“扩展”,非标准函数,以及编译器开发人员提供的“编译器特性”。

在移植过程中会导致问题的微软特定功能的简短列表:

  1. pragma一次。 (以及几乎每个编译指示)将被另一个编译器忽略,这将导致多个头部包含。可能会造成麻烦。

  2. __ int32和类似类型(特定于Microsoft)
  3. 来自windows.h的所有内容 - DWORD / WORD / HANDLE / TCHAR。特定于os的API和系统调用。这包括WinMain()。
  4. 以两个下划线开头的每个内置类型,宏和关键字(____ FUNCTION __,__ int32,__ decclspec等)。
  5. 某些版本的* printf函数 - swprintf,vswprintf等。某些格式(%S)规范在不同的编译器上表现不同。
  6. * _ s函数(strcpy_s等)。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

每个语句中非常干净但不可移植的Visual c++ "for each" portability