2016-04-17 2 views
7

Вокруг Интернета я вижу библиотеки, которые утверждают, что они написаны на портативных C++, , как если бы это был (возможно, неофициальный) стандарт.Что такое "Portable C++"?

Есть ли точное определение портативного C++, и если да, то что это такое?

Я не прошу об общих практиках написания переносного кода, но если есть что-то, что мы можем назвать «портативным C++».

+2

Среди прочих, код, который не использует расширения, специфичные для компилятора, и не зависит от неопределенного поведения, даже если он работает. –

+4

Код, который придерживается стандарта iso, не использует специфичные для платформы функции, такие как os-вызовы или встроенную сборку для определенного процессора, и поэтому может быть скомпилирован для запуска на любой платформе со стандартным компилятором. – Unimportant

+1

Я предполагаю, что реальный вопрос - это то, что «не переносит C++» :-) –

ответ

8

Портативный C++ довольно неоднозначный.

Однако, если вы хотите достичь портативности, использовать только стандартную библиотеку C++, а не платформы конкретного кода (как read, write системных вызовов на Linux), не компилятор конкретных Intrinsics (например, C GCC в/C++ расширения), или встроенная сборка для конкретного процессора.

Имейте в виду, что даже это может быть не «переносимым». Вы можете скомпилировать C++ для самых разных платформ (включая встроенные), и не все эти платформы могут поставляться со стандартной библиотекой C++ или иметь компилятор, поддерживающий самые последние и самые большие возможности C++ (C++ 11, C++ 14 имеет в виду).

Настоящая мобильность не может быть достигнута, однако вы можете обеспечить переносимость для наиболее распространенных платформ или взять на себя поддержку этих X-платформ и построить для каждой из них конкретное решение для платформы (что представляет собой значительный объем работы , и приводит к большому количеству кода #ifdef OS1).

+2

Здесь есть большая серая область, где могут быть доступны переносные * в другие системы POSIX *. Windows - странная птица. Также необходимо проявлять осторожность и внимание, чтобы избежать особых особенностей компилятора. – tadman

+0

Да, правда. POSIX - это портативный компьютер в современных операционных системах. Даже для Windows (у нее все еще есть подсистема POSIX, хотя она и старая) и много библиотек для объединения вызовов POSIX в вызовы WinAPI (MinGW, Cygwin и т. Д.). – Leandros

+1

Не слишком ли портативный носитель? Я имею в виду, что вы не * имеете *, чтобы ограничить себя стандартом, если библиотеки требуют переносимости. – Default

4

Портативный код на C++ означает, что такой код может быть скомпилирован для (практически) любой платформы и любой реализации. Так что цели, это неважно, если программа должна быть запущена на

  • различные операционные системы (Windows, Linux, OSX)
  • различных архитектур (x86, x86-64, титан, СПАРК, рука)
  • разные библиотеки времени выполнения/составители (GCC, Clang, MSVC)

для достижения этой цели, вы должны рассмотреть многие аспекты - не используйте реализации определенных API-интерфейсы и поведение, только использовать стандартную библиотеку - Не следует использовать архитектуру, определенные предположения и поведение, как и char имеет 8 бит, или отрицательные целые числа являются 2-дополнение и переполнение или что int является 32-разрядное и так далее

Проблема, часто приходится использовать материал , для которого нет стандарта в C++, например, сетевых интерфейсов. Поэтому библиотеки часто пытаются обойти эту проблему, используя различные конкретные решения для самых популярных систем, выбранных препроцессором.

Так как вы видите, что переносимость всегда должна видеть в контексте, поскольку абсолютная мобильность не является практической достижимой. Например, код C++, переносимый для любого компилятора, совместимого с C++ 11 (но большинство компиляторов не 100%, см. MSVC 12/2013) или переносимый для компиляторов, совместимых с C++ 11 и POSIX (так что все Unix-системы могут используй это). И так далее.

+0

Можете ли вы назвать систему, которая все еще используется, где 'char' не 8 бит? Это разрешено даже в C++ 14? Я знаю по историческим причинам, что это может быть что угодно, но на практике это все еще так? – tadman

+0

@ tadman Я знал, что кто-то поднимет это, СНОВА. Стандарты C++ и C не делают никаких утверждений о точной длине 'char', ни существующих, ни будущих. Для архитектур были 'CHAR_BIT! = 8' см. Http://stackoverflow.com/a/6972551/3537677 – Superlokkus

+0

Вот список оборудования настолько редкий, что мы должны больше беспокоиться о том, чтобы попасть в молнию или выиграть джекпот Powerball, чем когда-либо напишите код для этого. Я спрашивал, есть ли что-то общее, что мы, возможно, не понимаем, имеет нестандартный размер 'char'. Например, как это делают некоторые встроенные процессоры или DSP. – tadman