2010-06-02 4 views
5

Можно создать дубликат:
Use the keyword class as a variable name in C++C++ «новый» ключевое слово и C

В заголовочном файле C библиотеки, я использую одну из переменных называется «новый» , К сожалению, я использую эту библиотеку в проекте на C++, а появление «новых» в качестве имен переменных приводит к компромиссу. Я уже использую extern «C» {#include < ...>}, но это, похоже, не помогает в этом отношении.

Мне нужно, чтобы разработчик библиотеки изменил имя этой переменной, хотя с его точки зрения, как разработчик C, код абсолютно прекрасен, поскольку «новый» не является ключевым словом C?

+1

Разработчик библиотеки решил назвать глобальную переменную 'new'? – dreamlax

+1

Я думаю, что это в основном дубликат http://stackoverflow.com/questions/2841204/use-the-keyword-class-as-a-variable-name-in-c – sbi

+0

Черт. Как вы нашли это, sbi? Я действительно пытался найти ответ перед публикацией, но так и не встретил этого вопроса. – Florian

ответ

3

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

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

Долгосрочный, да, вы должны довести это до сведения разработчика библиотеки.

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

+0

Я знаю, что могу просто удалить или переименовать эту переменную, так как он используется только в объявлении функции.Я искал решение, которое оставляет файл заголовка C библиотеки нетронутым. Извините, если это было недостаточно ясно. Спасибо за ваш ответ. В конце я изменил заголовок файла, и я свяжусь с разработчиками библиотеки об этом. – Florian

0

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

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

Вы создаете отдельный C++ проект с исходным файлом (* .cpp), добавить #include в этот файл заголовка третьей стороной, и ссылку (Google «связывающие» LIBS и т. д.) бинарный файл библиотеки в ваш проект.

Я надеюсь, что помогает немного, Приветствия

+0

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

7

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

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

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

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

-Dnew=mynew 
+0

И тогда надеюсь, что еще нет существующей переменной под названием 'mynew' :) – dreamlax

+0

Мне не нужен доступ к ней, это просто параметр в объявлении функции. Я вижу, где ваш заголовок: Поскольку препроцессор заменяет «новый» на «mynew», компилятор C++ никогда не увидит «новый» в заголовочном файле, а только «mynew», который не является ключевым словом C++ и поэтому хорошо использовать. – Florian

+0

И в ответ на dreamlax: Это должно только вызвать проблему, если использовать часть «-Dnew = mynew». Первая часть должна быть отлично и в моем случае достаточно. – Florian

1

Вы можете написать свои собственные функции оболочки в 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" 

... 

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

Смежные вопросы