C++ 'новое' ключевое слово и C [дубликат]

5
задан Community 23 May 2017 в 10:33
поделиться

4 ответа

Перед включением файла заголовка используйте препроцессор, чтобы переименовать новый :

#define new mynew
#include <...>
#undef new

, что позволит продолжить компиляцию.

Вам действительно нужен доступ к этой переменной? Если нет - то все готово. В этом случае необходимо убедиться, что файлы .c для библиотеки скомпилированы с использованием

-Dnew=mynew
7
ответ дан 13 December 2019 в 19:22
поделиться

Вы можете написать свои собственные функции-оболочки на C. Все, что вы используете, что касается библиотеки, будет написано на C с помощью файлов заголовков, удобных для C ++. Итак, вместо:

other_lib.h:
int foo( int new );

my_app.cxx:
extern "C" {
#include <other_lib.h>
}

, который не компилируется, вы выполните:

my_wrap.h:
#ifdef __cplusplus
extern "C" {
#endif
int my_foo( int );
#ifdef __cplusplus
}
#endif

my_wrap.c:
#include <other_lib.h>
int my_foo( int x ) { return foo( x ); }

my_app.cxx:
#include "my_wrap.h"

...

Скомпилируйте my_wrap.c с помощью компилятора C, затем скомпилируйте my_app.cxx с помощью компилятора C ++. Это позволяет вам строить, не внося изменений в существующую библиотеку.

1
ответ дан 13 December 2019 в 19:22
поделиться

Требуется ли, чтобы заголовок содержал имя этой переменной? Если вы используете глобальную переменную с именем «новая», то, конечно, это может быть причиной того, что вам необходимо иметь глобально видимое имя переменной. С другой стороны, если это что-то вроде аргумента функции с именем «новый», просто удалите имя из объявления функции. Если имя является членом структуры или объединения, изменение его в файле заголовка не повредит коду .C, пока код .C видит «частное» определение с именем, соответствующим этому исходному коду.

Поскольку файлы .C должны быть скомпилированы в синтаксисе C и, таким образом, смогут справиться с переменной с именем "new", исправление файлов заголовков должно быть допустимым решением.

Да, в долгосрочной перспективе вам следует обратить на это внимание разработчика библиотеки.

В качестве последнего, несколько хитрого решения вы можете изменить заголовочный файл с «нового» на что-то, например, «было_новое». А при компиляции файлов C библиотеки используйте переключатели компилятора для принудительного выполнения #define new was_new .

3
ответ дан 13 December 2019 в 19:22
поделиться

Если вы модифицируете отличный заголовочный файл сторонней библиотеки, я бы порекомендовал вам остановиться. Вы пытаетесь добавить код C ++ в библиотеку C, если я правильно вас понял, этого не произойдет, C не распознает ключевое слово «new», поскольку это ключевое слово C ++.

Вместо этого я бы рекомендовал следующее:

Вы создаете отдельный проект C ++ с исходным файлом (* .cpp), добавляете #include к этому стороннему заголовочному файлу и связываете (google "связывание библиотек" и т. Д.) ) двоичный файл библиотеки в ваш проект.

Надеюсь, это немного поможет, Ура

0
ответ дан 13 December 2019 в 19:22
поделиться