Пользование библиотекой C++ в коде C

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

97
задан 8 revs, 4 users 63% 25 April 2016 в 17:58
поделиться

4 ответа

Да, это, конечно, возможно. Необходимо будет записать интерфейсный слой в C++, который объявляет функции с extern "C":

extern "C" int foo(char *bar)
{
    return realFoo(std::string(bar));
}

Затем Вы будете звонить foo() от Вашего модуля C, который передаст запрос эти realFoo() функция, которая реализована в C++.

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

67
ответ дан Greg Hewgill 24 November 2019 в 05:30
поделиться

Облегченный FAQ C++: , "Как смешать C и C++, кодируют" .

Некоторые глюки описаны в ответах на эти вопросы:

  • [32.8], Как я могу передать объект класса C++ к/от функции C?
  • [32.9] мой C может функционировать непосредственно данные доступа в объекте класса C++?
22
ответ дан omninonsense 24 November 2019 в 05:30
поделиться

Основной глюк: исключения не могут быть пойманы в C. Если существует, возможность исключения, повышающегося в коде C++, или, пишет Ваш код C или Ваши обертки C++ очень тщательно. С другой стороны исключение как механизмы (т.е. longjump) в коде C (как найдено в различных языках сценариев) не требуется, чтобы вызывать деструкторы для объектов C++ на стеке.

11
ответ дан ejgottl 24 November 2019 в 05:30
поделиться

можно смешать код C/C++. Если Ваше основное () функционирует в в C++, то просто необходимо удостовериться, что функции c объявляются

extern "C"

, Если основное является C, то Вы, вероятно, в порядке за исключением статических переменных. Любых конструкторов с Вашими статическими переменными, как предполагается, вызывают, прежде чем основной () запустятся. Этого не произойдет, если C будет Вашим основным. Я, которого у Вас есть много статических переменных, лучшая вещь сделать, должен заменить статические переменные одиночными элементами.

3
ответ дан David Nehme 24 November 2019 в 05:30
поделиться