Мы пытаемся изменить некоторые существующие проекты на C, т.е. Мы пытаемся сделать некоторые вызовы функций C++ из кода C. Мы попытались сменить компилятор из gcc на g++, но из-за несовместимости было несколько ошибок компиляции. Мы пытаемся вызвать некоторые функции C++ в коде C, не внося никаких изменений в существующий код. Простое изменение компилятора, похоже, не помогло. Поэтому мы попытались:
#include <stdio.h>
extern "C"
{
int func(int new ) {
printf("in new func()\n");
}
}
Когда я скомпилирую его с помощью команды
g++ -c hello.c -o привет
мы получаем следующие ошибки
hello.c:9: error:expected ‘, or ‘... before ‘new.
Теперь мы знаем, что новое ключевое слово C++. Как упоминалось ранее, мы стараемся не вносить какие-либо изменения в существующий код C. Какие-либо предложения?
Это не единственные ошибки. Существуют и другие ошибки, связанные с объявлением структуры.
attr.c: 75: ошибка: ожидаемое первичное выражение перед '. знак
На attr.c строка 75
static post_op_attr error_attr = {.attributes_follow = FALSE};
Проблема в том, что в коде есть еще одна декларация структуры C и инициализация, поэтому, даже если мы переименуем имя переменной, нам все равно придется изменять другие части программы C. Следовательно, мы ищем способ добавить вызовы функций C++ к C-коду без изменения существующего кода C.
new
- это ключевое слово, поэтому вы не можете вызвать переменную new
. Но даже если бы я мог не знать, почему вы это сделаете, потому что это невероятно трудно читать.
Даже если вы используете extern "C"
вы все еще компилируете с g++
который является компилятором c++, и он собирается жаловаться на это.
В основном код C не всегда может работать без изменений в c++, потому что c++ ввел некоторые ключевые слова. Это один из тех случаев, когда у вас нет выбора, кроме как изменить код существующего кода кода C, чтобы он мог компилироваться как код c++.
Как вы говорите, new
это C++ ключевое слово, поэтому не может быть использован в качестве имени переменной.
Если ваш C-код вызывает функции C++, вы действительно должны понимать, что это не C и более, но C++. И это будет означать больше (гораздо больше, если вы хотите сделать это идиоматическим C++), а затем просто замените несколько сильно названных переменных.
Но, если вы намерены внести минимальные изменения в свою кодовую базу C, вы можете попробовать этот взлом:
#define new new__
Но я бы не рекомендовал это как долговременное решение.
#define
, вероятно, будет работать на большинстве компиляторов, он является недопустимым с точки зрения Стандартного C++
. Так что если вы используете это, вы не пишете C++
больше (хотя это вероятно , будет работать).
new
- это ключевое слово, не используйте g++, если вы не хотите изменять код. Вместо этого используйте gcc
.
Примечание: если это c-код, он никогда не должен включать extern "C"
, если он c++ код, он никогда не должен использовать new
переменную.
Правила в C++ для идентификаторов:
1. Разрешены только алфавиты, цифры и подписи.
2. Имя идентификатора не может начинаться с цифры.
3.Key words cannot be used as a name.
Буквы и буквы нижнего регистра различны.
5. Специальные символы не допускаются
Идентификатор 6.Global не может использоваться как "Идентификатор".
EDIT: в отношении вашего требования вызывать функции C++ из кода C, не изменяя код C,
один из способов - написать обертку вокруг вашего C++ кода в C, а затем скомпилировать с помощью gcc, не просто вызвать код c непосредственно из g++, как описано здесь:
вам также может понравиться следующее:
http://www.thegeekstuff.com/2013/01/mix-c-and-cpp/
http://research.engineering.wustl.edu/~beardj/Mixed_C_C++.html
а также
Мигрировал из вашего удаленного вопроса.
extern "C"
не будет обрабатывать этот код как код C, это просто опция привязки.
Проверьте этот пост здесь на SO для получения дополнительной информации о том, что это значит. Чтобы сделать его коротким (и простым), он изменяет, как имя функции хранится в двоичных файлах (C++ компилятор компилятора - украшает имена функций из-за перегрузок функций: одно и то же имя, но разные параметры). Это нужно вам только тогда, когда вы связываете библиотеку C с модулем C++ (или когда вы экспортируете интерфейс C из вашего модуля C++).
Потому что вы используете компилятор C++ (g++ является C++ интерфейсом GCC, смущенным? Взгляните на это сообщение о том, какая разница между gcc и g++), ваш файл будет скомпилирован как C++ код и вы не можете использовать ключевые слова C++ (как опубликовано в этом ответе).
Для компиляции исходных файлов C (при условии, что вы не можете просто вызвать gcc
C frontend), используя интерфейс g++
C++, вы должны использовать -std=c99
(см. Эту документацию для поддержки GCC C99).
g++ -c -std=c99 hello.c -o hello
C и C++ - это разные языки, поэтому не имеет смысла компилятор C-кода с компилятором C++.
Но вам не нужно, люди объединяют C и C++ в разных единицах компиляции на ежедневной основе. Просто создайте общий заголовочный файл toto.h
который вы toto.h
в оба. У всех функций есть внутреннее предложение extern "C"
, которое вы делаете невидимым для C и видимым для C++.
#ifdef __cplusplus
extern "C" {
#endif
// your function declarations (not definitions) go here
#ifdef __cplusplus
}
#endif
Теперь вы можете реализовать свои функции в отдельных единицах компиляции (файлы.c). И эти функции могут без проблем вызвать друг друга.
На каждом языке компьютера есть несколько ключевых слов резервирования, которые он не позволяет использовать в качестве имен переменных. Вот список ключевых слов, зарезервированных на языке c, которые вы не должны использовать в качестве имен переменных. Http://www.tutorialspoint.com/ansi_c/c_reserved_keywords.htm
Еще одна вещь, которую вы компилируете на компиляторе c++, поэтому вам также следует избегать использования зарезервированных ключевых слов c++, здесь есть ссылка на ключевые слова c++ http://cs.smu.ca/~porter/csc/ref/cpp_keywords.html
Измените new
с помощью чего-то другого, например, изменить new
с помощью num
или что-нибудь еще.
extern "C"
объявления функций, которые вам нужно вызывать.C++
вам не нужно давать аргументу имя.