Ошибка компиляции кода C с именем переменной, новой с g ++

0

Мы пытаемся изменить некоторые существующие проекты на 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.

  • 2
    Если вы не хотите вносить какие-либо изменения в код C, почему бы не продолжить его компиляцию как C? Из C ++ вам просто нужны extern "C" объявления функций, которые вам нужно вызывать.
  • 1
    Чтобы прояснить точку зрения Чарльза, обратите внимание, что в объявлении в вашей программе на C++ вам не нужно давать аргументу имя.
Показать ещё 3 комментария
Теги:
gcc
g++

7 ответов

7

new - это ключевое слово, поэтому вы не можете вызвать переменную new. Но даже если бы я мог не знать, почему вы это сделаете, потому что это невероятно трудно читать.

Даже если вы используете extern "C" вы все еще компилируете с g++ который является компилятором c++, и он собирается жаловаться на это.

В основном код C не всегда может работать без изменений в c++, потому что c++ ввел некоторые ключевые слова. Это один из тех случаев, когда у вас нет выбора, кроме как изменить код существующего кода кода C, чтобы он мог компилироваться как код c++.

  • 0
    Но это строка верно?
  • 0
    Извините, сейчас понятно
Показать ещё 7 комментариев
3

Как вы говорите, new это C++ ключевое слово, поэтому не может быть использован в качестве имени переменной.

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

Но, если вы намерены внести минимальные изменения в свою кодовую базу C, вы можете попробовать этот взлом:

#define new new__ 

Но я бы не рекомендовал это как долговременное решение.

  • 1
    Хотя #define , вероятно, будет работать на большинстве компиляторов, он является недопустимым с точки зрения Стандартного C++ . Так что если вы используете это, вы не пишете C++ больше (хотя это вероятно , будет работать).
  • 0
    static post_op_attr error_attr = {.attributes_follow = FALSE}; ошибка: attr.c: 75: ошибка: ожидаемое первичное выражение перед '.' Проблема в том, что в коде выполняются другие объявления и инициализация в стиле C, поэтому даже если мы переименуем имя переменной, нам все равно придется изменить другие части программы на C
Показать ещё 5 комментариев
1

new - это ключевое слово, не используйте g++, если вы не хотите изменять код. Вместо этого используйте gcc.

Примечание: если это c-код, он никогда не должен включать extern "C", если он c++ код, он никогда не должен использовать new переменную.

  • 0
    static post_op_attr error_attr = {.attributes_follow = FALSE}; ошибка: attr.c: 75: ошибка: ожидаемое первичное выражение перед '.' Проблема в том, что в коде выполняются другие объявления и инициализация в стиле C, поэтому даже если мы переименуем имя переменной, нам все равно придется изменить другие части программы на C
1

Правила в C++ для идентификаторов:

1. Разрешены только алфавиты, цифры и подписи.

2. Имя идентификатора не может начинаться с цифры.

3.Key words cannot be used as a name.

Буквы и буквы нижнего регистра различны.

5. Специальные символы не допускаются

Идентификатор 6.Global не может использоваться как "Идентификатор".

EDIT: в отношении вашего требования вызывать функции C++ из кода C, не изменяя код C,

один из способов - написать обертку вокруг вашего C++ кода в C, а затем скомпилировать с помощью gcc, не просто вызвать код c непосредственно из g++, как описано здесь:

Как вызвать функцию C++ из C?

вам также может понравиться следующее:

http://www.thegeekstuff.com/2013/01/mix-c-and-cpp/

http://research.engineering.wustl.edu/~beardj/Mixed_C_C++.html

а также

http://www.parashift.com/C++-faq-lite/c-calls-cpp.html

  • 0
    static post_op_attr error_attr = {.attributes_follow = FALSE}; ошибка: attr.c: 75: ошибка: ожидаемое первичное выражение перед '.' Проблема в том, что в коде выполняются другие объявления и инициализация в стиле C, поэтому даже если мы переименуем имя переменной, нам все равно придется изменить другие части программы на C
  • 0
    @Raheel: Действительно. Никакая магия не превратит программу C99 в C ++ 11. Два языка разветвились в начале 90-х годов. Сегодня они в основном совместимы с ссылками.
0

Мигрировал из вашего удаленного вопроса.

Какой extern "C"

extern "C" не будет обрабатывать этот код как код C, это просто опция привязки.

Проверьте этот пост здесь на SO для получения дополнительной информации о том, что это значит. Чтобы сделать его коротким (и простым), он изменяет, как имя функции хранится в двоичных файлах (C++ компилятор компилятора - украшает имена функций из-за перегрузок функций: одно и то же имя, но разные параметры). Это нужно вам только тогда, когда вы связываете библиотеку C с модулем 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
0

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). И эти функции могут без проблем вызвать друг друга.

0

На каждом языке компьютера есть несколько ключевых слов резервирования, которые он не позволяет использовать в качестве имен переменных. Вот список ключевых слов, зарезервированных на языке 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 или что-нибудь еще.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню