Ответ 1
Для максимальной надежности:
- Скомпилируйте источник C с компилятором C.
- Скомпилировать исходный код С++ с помощью компилятора С++
- Предпочтительно, напишите функцию main() в С++.
- Свяжите программу с компилятором С++.
Убедитесь, что заголовки C либо сами знают С++, либо что код С++ содержит заголовки C внутри блока extern "C" { ... }
.
Либо (файл заголовка C cheader.h
):
#ifndef CHEADER_H_INCLUDED
#define CHEADER_H_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
...main contents of header...
#ifdef __cplusplus
}
#endif
#endif /* CHEADER_H_INCLUDED */
или (исходный код на С++):
extern "C" {
#include "cheader.h"
}
Современный стиль C очень близок к общему подмножеству языков C и С++. Тем не менее, произвольный код C не является кодом С++ для любого из очень большого числа причин, и просто вызов исходных файлов C исходных файлов С++ (путем изменения расширения или просто путем компиляции с компилятором С++) не гарантируется, В общем, проще скомпилировать C как C и С++ как С++, а затем связать результирующие объектные файлы с С++-компилятором (чтобы убедиться, что вызваны правильные библиотеки поддержки).
Однако, если компилятор MSVC говорит, что программы, использующие MFC, должны быть записаны исключительно на С++ (MFC требует, чтобы компиляция С++ (с использованием суффикса .cpp) была сообщенной ошибкой), тогда у вас может не быть выбора, кроме как обеспечить, чтобы ваш код C можно компилировать как код на С++. Это означает, что вам нужно будет отображать возвращаемые значения из malloc()
et al; вам нужно беспокоиться о других местах, где вы не используете приведение, чтобы преобразовать void *
в другой тип указателя; вам нужно беспокоиться о sizeof('a') == 4
в C и sizeof('a') == 1
в С++; вы должны обеспечить, чтобы каждая функция была объявлена до ее использования; вы должны убедиться, что ваш C-код не использует ключевые слова С++ (в частности, typename
, class
, а также inline
), но полный список довольно большой).
В некоторых кругах вам придется беспокоиться об использовании функций на C99, которые не находятся в С++ 2003 или С++ 2011, например, о гибких элементах массива, назначенных инициализаторах, сложных литералах, массивах переменной длины, и так далее. Однако, если код C для MSVC, то это, вероятно, не будет проблемой; эти функции не поддерживаются компилятором MSVC C (он поддерживает только C89, а не C99).
FWIW: У меня есть script для поиска ключевых слов на С++. Он содержит следующий комментарий:
# http://en.cppreference.com/w/cpp/keywords
# plus JL annotations
# and C (<iso646.h>)
# and_eq C (<iso646.h>)
# alignas (C++11 feature)
# alignof (C++11 feature)
# asm C (core)
# auto(1) C (core)
# bitand C (<iso646.h>)
# bitor C (<iso646.h>)
# bool C99 (<stdbool.h>)
# break C (core)
# case C (core)
# catch
# char C (core)
# char16_t (C++11 feature)
# char32_t (C++11 feature)
# class
# compl C (<iso646.h>)
# const C (core)
# constexpr (C++11 feature)
# const_cast
# continue C (core)
# decltype (C++11 feature)
# default(1) C (core)
# delete(1)
# double C (core)
# dynamic_cast
# else C (core)
# enum C (core)
# explicit
# export
# extern C (core)
# false C99 (<stdbool.h>)
# float C (core)
# for C (core)
# friend
# goto C (core)
# if C (core)
# inline C (core)
# int C (core)
# long C (core)
# mutable
# namespace
# new
# noexcept (C++11 feature)
# not C (<iso646.h>)
# not_eq C (<iso646.h>)
# nullptr (C++11 feature)
# operator
# or C (<iso646.h>)
# or_eq C (<iso646.h>)
# private
# protected
# public
# register C (core)
# reinterpret_cast
# return C (core)
# short C (core)
# signed C (core)
# sizeof C (core)
# static C (core)
# static_assert (C++11 feature)
# static_cast
# struct C (core)
# switch C (core)
# template
# this
# thread_local (C++11 feature)
# throw
# true C99 (<stdbool.h>)
# try
# typedef C (core)
# typeid
# typename
# union C (core)
# unsigned C (core)
# using(1)
# virtual
# void C (core)
# volatile C (core)
# wchar_t C (core)
# while C (core)
# xor C (<iso646.h>)
# xor_eq C (<iso646.h>)
Суффиксы (1)
являются сносками в CPP Reference:
-
(1)
- значение изменено в С++ 11