Почему такие ошибки появляются при компиляции с ключем -x c++ ? То есть, если делаю програмку обычную, и делаю ему gcc -o mp3 mp3.c то всё ОК, а если переделываю на с++ и пишу ему gcc -x c++ -o mp3 mp3.c то пишет такое :
/usr/locale/include/libmpd/libmpd.h:94:error: using typedef - name 'mpd_Song' after 'struct'
/usr/locale/include/libmpd/libmpdclient.h:94:error: 'mpd_Song' has a previous declaration here
/usr/locale/include/libmpd/libmpd.h:94:error: invalid type in declaration before ';' tokenчего он хочет ?
>Почему такие ошибки появляются при компиляции с ключем -x c++ ?
>То есть, если делаю програмку обычную, и делаю ему gcc -o
>mp3 mp3.c то всё ОК, а если переделываю на с++ и
>пишу ему gcc -x c++ -o mp3 mp3.c то пишет такое- Доктор, а почему если я делаю вот так, то мне больно?
- А вы не делайте.
man gcc: "
If you only want some of the stages of compilation, you can use -x (or filename suffixes) to tell gcc where to start, and one of the options -c, -S, or -E to say where gcc is to stop. Note that some combinations (for example, -x cpp-output -E) instruct gcc to do nothing at all.
"Похоже у тебя не включились какие-то инструкци препроцессора, вот оно и заглючило на определениях типов. Возможно нужны ещё -x c++-header и -x c++-cpp-output
Я бы просто переименовал исходник в .C, .cpp или .cc. И тебе понятнее, и компилятору.
Кстати, C++ не совсем совместим снизу вверх с C. Например,typedef struct aaa {
int a, b, c;
} bbb;typedef struct bbb {
double a, b, c;
} aaa;нормально сработает в C но вызовет ошибку в C++ (в C++ "struct имя" уже определяет тип).
>Кстати, C++ не совсем совместим снизу вверх с C. Например,
>
>typedef struct aaa {
> int a, b, c;
>} bbb;
>
>typedef struct bbb {
> double a, b, c;
>} aaa;
>
>нормально сработает в C но вызовет ошибку в C++ (в C++ "struct
>имя" уже определяет тип).struct aaa {
...
};
тоже самое, что и:
typedef struct {
...
} aaa;
но, ИМХО, второе куда более убого. Окаменелый это способ описывать типы структур.
>>Кстати, C++ не совсем совместим снизу вверх с C. Например,
>>
>>typedef struct aaa {
>> int a, b, c;
>>} bbb;
>>
>>typedef struct bbb {
>> double a, b, c;
>>} aaa;
>>
>>нормально сработает в C но вызовет ошибку в C++ (в C++ "struct
>>имя" уже определяет тип).
>
>struct aaa {
>...
>};
>тоже самое, что и:
>typedef struct {
>...
>} aaa;
>но, ИМХО, второе куда более убого. Окаменелый это способ описывать типы структур.
>
так что же все таки мне делать ? Включить -x c++-header и -x c++-cpp-output в компиляторе ? или изменять опеределение структур ?исходник у меня кстати .cpp
>Почему такие ошибки появляются при компиляции с ключем -x c++ ?
>То есть, если делаю програмку обычную, и делаю ему gcc -o
>mp3 mp3.c то всё ОК, а если переделываю на с++ и
>пишу ему gcc -x c++ -o mp3 mp3.c то пишет такое
>:
>/usr/locale/include/libmpd/libmpd.h:94:error: using typedef - name 'mpd_Song' after 'struct'
>/usr/locale/include/libmpd/libmpdclient.h:94:error: 'mpd_Song' has a previous declaration here
>/usr/locale/include/libmpd/libmpd.h:94:error: invalid type in declaration before ';' token
>
>чего он хочет ?
так что же все таки мне делать ? Включить -x c++-header и -x c++-cpp-output в компиляторе ? или изменять опеределение структур ?исходник у меня кстати .cpp
>так что же все таки мне делать ?То что на C пускай и компилируется gcc без всяких -x, то что на C++ пускай компилируется g++, всё вместе пусть линкуется g++. Надо только не забывать про extern "C". C и C++ - всё-таки разные языки и не надо их путать ;)
>>так что же все таки мне делать ?
>
>То что на C пускай и компилируется gcc без всяких -x, то
>что на C++ пускай компилируется g++, всё вместе пусть линкуется g++.
>Надо только не забывать про extern "C". C и C++ -
>всё-таки разные языки и не надо их путать ;)
так эта библиотека ,на заголовочный файл которой он ругается - libmpd.h , на С, и работает в программах на С ... а вот когда я пытаюсь использовать её в программе С++ , она ругается ... а собрать то я её не могу , она уже готова .... что ж мне , исходники её менять ?
>так что же все таки мне делать ? Включить -x c++-header и
>-x c++-cpp-output в компиляторе ? или изменять опеределение структур ?
>
>исходник у меня кстати .cppВ примере у тебя - mp3.c, что в данном случае принципиально.
Убери -x, компилятор сам разберётся. Для старых .h, писаных на C и описывающих библиотеки C используй трюк в своём исходнике:
extern "C" {
#include <c_source_header.h>
};
Слушай, я как то по молодости пропутил по большому счёту С'шник, так что юзаю только С++. Возьми да переименуй в *.cpp, возьми книжку посолиднее и следуй пожсказкам транслятора(типа: строка такая-то: хреновый синтаксис! ;)) Помоему вполне не плохой вариант.