Стандартный C ++ способ вызова стандартных библиотечных функций C - PullRequest
0 голосов
/ 16 января 2019

У меня есть несколько вопросов о вызове функций стандартной библиотеки C в C ++:

  1. Если я хочу вызвать getline(), который объявлен в <stdio.h>, всегда ли достаточно просто включить <cstdio>?Это работает с компилятором, который я использую, и я вижу, что он включает <stdio.h> в <cstdio>, но я хочу знать, гарантирует ли это стандарт.
  2. Все ли функции стандартной библиотеки C гарантированно доступны вC ++?На примере getline(), приведенном выше, я заметил, что в cppreference в <cstdio> он не выводит список getline().
  3. Для стандартных функций библиотеки C и типов, которые доступны вПространство имен std::, такое как FILE или malloc(), представляют ли они какие-либо проблемы с доступом к ним через глобальное пространство имен или просто более идиоматично получать к ним доступ как std::FILE или std::malloc()?

Ответы [ 3 ]

0 голосов
/ 16 января 2019

По отношению к # 3 :

Библиотеки .h должны размещать все свои имена в глобальном пространстве имен, а также могут помещать их в пространство имен std::.

Начальная версия c должна поместить все свои имена в пространство имен std::, а также может разместить их в глобальном пространстве имен.

0 голосов
/ 17 января 2019

Должно быть легко связать любую библиотеку C с C ++ в целом, а не только со стандартными заголовками.

Обратите внимание, что вам, возможно, придется пройти через man, чтобы выяснить, какая версия какого Unix был введен в метод или является конкретным расширением, и решить для себя, является ли эта историческая начальная точка приемлемой для вас. Но это правда, если вы написали программу на C вместо C ++.

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

Итак, как это работает, так это то, что функции C, включая функции библиотеки C, вводятся с ключевым словом extern "C".

Когда вы #include заголовочные файлы C, они обычно содержат некоторый код, такой как:

/* C++ needs to know that types and declarations are C, not C++.  */
#ifdef  __cplusplus
# define __BEGIN_DECLS  extern "C" {
# define __END_DECLS    }
#else
# define __BEGIN_DECLS
# define __END_DECLS
#endif

__BEGIN_DECLS

... который представляет раздел функций интерфейса C.

Если вам нужно было включить действительно старую библиотеку C, которая этого не делала, тогда вы можете легко добавить extern "C" вокруг #include:

extern "C" {
#include "ancientinterface.h"
};

Вы также можете написать свои собственные методы, совместимые с интерфейсом «C».

0 голосов
/ 16 января 2019

Вы должны всегда включать то, что говорит вам документация. (Реализации стандартной библиотеки C ++ часто пишутся так, чтобы функции были доступны через другие включения, но, конечно, полагаясь на это, означает, что ваш код не переносим.) Обратите внимание, что в C. нет функции standard getline. Но есть один в C ++:

std::getline()

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

Ссылка: https://en.cppreference.com/w/cpp/string/basic_string/getline

...