Можем ли мы использовать библиотеки POSIX C в C ++?

Я новичок в области системного программирования Linux. В настоящее время я программирую на C и хочу перейти на c ++.

Можем ли мы использовать все функции, определенные в библиотеках POSIX C в c ++, без каких-либо изменений?

3

Решение

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

Тем не менее, вы все равно можете столкнуться с проблемами. По моему опыту, наиболее распространенными проблемами являются:

  1. Заголовки C API часто сбрасывают сотни символов в глобальное пространство имен. Некоторые из этих символов могут конфликтовать с символами библиотеки C ++, что может привести к проблемам, если вы using namespace std (но ты этим не занимался, верно?)
  2. Заголовки C API часто интенсивно используют макросы, в том числе имена макросов, которые могут конфликтовать с символами библиотеки C ++; std:: не спасу тебя там.
  3. Компиляция вашей программы в режиме строгого соответствия (например, -std=c++11 -D_XOPEN_SOURCE=700) может выявить ошибки в системных заголовках. Скорее всего, это случится с C ++, чем с C.
  4. Небольшая горстка API POSIX имеет ненормальное поведение потока управления, которое может плохо взаимодействовать с исключениями и деструкторами C ++, в зависимости от того, насколько тщательно разработчик библиотеки C пытался избежать этой проблемы. setjmp а также longjmp очевидно, проблема здесь (кто-нибудь сделал библиотеку C, которая реализует те на вершине Обработка исключений в стиле DWARF?) fork, setcontext и друзья, pthread_cancel, pthread_cleanup_pushи, возможно, несколько других, которые я не могу вспомнить с головы до головы. (Я помню гигантский, в конечном счете, неубедительный спор между Ульрихом Дреппером и ребятами из GCC C ++ в 2004 году или около того о том, как именно pthread_cancel должен вести себя в присутствии деструкторов.)

Если вы выходите за рамки POSIX, у вас могут возникнуть проблемы с:

  1. Заголовки, которые не удосуживаются обернуть все объявления в extern "C" блок при компиляции как C ++, что означает, что все имена функций искажаются, когда их не должно было быть, и ссылка завершается ошибкой.
  2. Заголовки, которые даже не удосуживаются придерживаться пересечения C и C ++. В худшем случае это может привести к сбоям, которые не проявляются, пока не будет запущена программа. Наиболее распространенные случаи этого:
    • Беспечно используя какое-то ключевое слово C ++ в качестве объявленного имени (например, int template;)
    • При условии, что void * совместимо ли присвоение с другими типами указателей (например, что нет необходимости приводить результат malloc)
    • При условии, что struct foo; делает не определить typedef-имя foo

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

6

Другие решения

«Можем ли мы использовать все функции, определенные в библиотеках POSIX C в c ++, без каких-либо изменений?»

Конечно вы можете. Любой API в стиле c можно без проблем использовать в c ++.

1

По вопросам рекламы [email protected]