LINUX.ORG.RU

wchar.h errors


0

0

День добрый. У меня Ubuntu 8.04 64-bit, libc6-dev версии 2.7-10. Проблема в том что при компиляции любой программы использующей например iostream.h, которая в свою очередь подключает wchar.h, получаем следуещее:

[code] /usr/include/wchar.h:527: error: expected initializer before ‘*’ token /usr/include/wchar.h:534: error: ‘__FILE’ was not declared in this scope /usr/include/wchar.h:534: error: ‘__fp’ was not declared in this scope /usr/include/wchar.h:534: error: expected primary-expression before ‘int’ /usr/include/wchar.h:534: error: initializer expression list treated as compound expression /usr/include/wchar.h:534: error: expected ‘,’ or ‘;’ before ‘throw’ /usr/include/wchar.h:541: error: ‘__FILE’ was not declared in this scope /usr/include/wchar.h:541: error: expected primary-expression before ‘__restrict__’ /usr/include/wchar.h:542: error: expected primary-expression before ‘const’ /usr/include/wchar.h:542: error: expected primary-expression before ‘...’ token /usr/include/wchar.h:542: error: initializer expression list treated as compound expression /usr/include/wchar.h:559: error: ‘__FILE’ was not declared in this scope /usr/include/wchar.h:559: error: expected primary-expression before ‘__restrict__’ /usr/include/wchar.h:560: error: expected primary-expression before ‘const’ /usr/include/wchar.h:561: error: expected primary-expression before ‘__arg’ /usr/include/wchar.h:561: error: initializer expression list treated as compound expression /usr/include/wchar.h:582: error: ‘__FILE’ was not declared in this scope /usr/include/wchar.h:582: error: expected primary-expression before ‘__restrict__’ /usr/include/wchar.h:583: error: expected primary-expression before ‘const’ /usr/include/wchar.h:583: error: expected primary-expression before ‘...’ token /usr/include/wchar.h:583: error: initializer expression list treated as compound expression /usr/include/wchar.h:636: error: ‘__FILE’ was not declared in this scope /usr/include/wchar.h:636: error: expected primary-expression before ‘__restrict__’ /usr/include/wchar.h:637: error: expected primary-expression before ‘const’ /usr/include/wchar.h:638: error: expected primary-expression before ‘__arg’ /usr/include/wchar.h:638: error: initializer expression list treated as compound expression /usr/include/wchar.h:692: error: ‘__FILE’ was not declared in this scope /usr/include/wchar.h:692: error: ‘__stream’ was not declared in this scope /usr/include/wchar.h:693: error: ‘__FILE’ was not declared in this scope /usr/include/wchar.h:693: error: ‘__stream’ was not declared in this scope /usr/include/wchar.h:706: error: ‘__FILE’ has not been declared /usr/include/wchar.h:707: error: ‘__FILE’ has not been declared /usr/include/wchar.h:722: error: ‘__FILE’ has not been declared /usr/include/wchar.h:729: error: ‘__FILE’ has not been declared /usr/include/wchar.h:736: error: ‘__FILE’ has not been declared /usr/include/wchar.h:748: error: ‘__FILE’ was not declared in this scope /usr/include/wchar.h:748: error: ‘__stream’ was not declared in this scope /usr/include/wchar.h:757: error: ‘__FILE’ was not declared in this scope /usr/include/wchar.h:757: error: ‘__stream’ was not declared in this scope /usr/include/wchar.h:765: error: ‘__FILE’ has not been declared /usr/include/wchar.h:774: error: ‘__FILE’ has not been declared /usr/include/wchar.h:785: error: ‘__FILE’ has not been declared /usr/include/wchar.h:794: error: ‘__FILE’ has not been declared [/code]

Переустановка вышеупомянутого пакета libc6-dev содержащего данный файл заголовков ничего не дала... Есть идеи?


iostream.h уже давно deprecated.
Пользуй iostream.
"iostream содержит щаблоны классы, которые поддерживают как обычные символы (char), так и "широкие" юникодные (wchar_t). iostream.h поддерживает только обычные символы." (c) не мой.

tzukko
()
Ответ на: комментарий от tzukko

Это все конечно прекрасно, но когда программа в сырцах не буду ж я их переписывать... А пользую таки iostream, но эффект тот же. Никаких тебе cout и cin

Например код: #include <iostream> int main(){ cout >> "Preved"; return 0; }

При: $ g++ ~/bugaga/io.c

Получаем: In file included from /usr/include/c++/4.2/cwchar:55, from /usr/include/c++/4.2/bits/postypes.h:46, from /usr/include/c++/4.2/iosfwd:49, from /usr/include/c++/4.2/ios:43, from /usr/include/c++/4.2/ostream:45, from /usr/include/c++/4.2/iostream:45, from /home/ink/bugaga/io.c:1:

Далее список ошибок указанных выше...

ink
() автор топика
Ответ на: комментарий от Sancho_s_rancho

/home/ink/bugaga/io.c:2: error: expected constructor, destructor, or type conversion before ‘namespace’ /home/ink/bugaga/io.c: In function ‘int main()’: /home/ink/bugaga/io.c:4: error: no match for ‘operator>>’ in ‘std::cout >> "Preved"’

Так что namespace std не кактит, так же как и std::cout. Суть то не в этом, а в первом посте, т.е. в даже косвенном #include <wchar.h>

ink
() автор топика
Ответ на: комментарий от ink

Ты, вообще, читаеш сообщения об ошибках?
Скомпили такое:

#include <iostream>
int main(){ std::cout << "Preved"; return 0; }

Ошибки из первого поста могут возникнуть при конфликт типов, очень похожи симптомы.

tzukko
()
Ответ на: комментарий от ink

1) вместо "cout >>" надо писать "std::cout <<"
2) зачем собирать программу из исходников, репозитории же
3) если таки собираете из исходников, то ССЗБ и редактируйте их

yoghurt ★★★★★
()
Ответ на: комментарий от tzukko

Переставил libstdc++6 и gcc

Скомпилил. Результат: In file included from /usr/include/c++/4.2/cwchar:55, from /usr/include/c++/4.2/bits/postypes.h:46, from /usr/include/c++/4.2/iosfwd:49, from /usr/include/c++/4.2/ios:43, from /usr/include/c++/4.2/ostream:45, from /usr/include/c++/4.2/iostream:45, from /home/ink/bugaga/io.c:1: //Далее те же ошибки в wchar.h

ink
() автор топика
Ответ на: комментарий от yoghurt

> 1) вместо "cout >>" надо писать "std::cout <<" > 2) зачем собирать программу из исходников, репозитории же 1) Да, согласен, с утра сонный =) 2) Не выход, если уж есть среда разработки, то она должна работать, например для собственных програм 3) Не самый рациональный вариант

ink
() автор топика
Ответ на: комментарий от ink

Остались только две догадки: несовместимость библиотек и компилятора, и железячные проблемы.
Дальше фантазия заканчивается, сам подобных проблем никогда не имел =)

tzukko
()
Ответ на: комментарий от ink

dmatveev@debian:~$ cat demo.cc
#include <iostream>

int main( int argc, char *argv[] )
{
    std::cout << "Я строка!" << std::endl;
    return 0;
}

Всё компиляется и работает. Файл в utf-8 кодировке.

dmatveev@debian:~$ g++ demo.cc -o demo
dmatveev@debian:~$ ./demo
Я строка!
dmatveev@debian:~$ g++ --version
g++ (Debian 4.3.2-1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Очисти карму))

yoghurt ★★★★★
()
Ответ на: комментарий от ink

Я думаю это больше связано с убунту =)

Хотя помнится в 8.04 у меня всё работало (стояла пару дней на ноуте в сентябре)

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

в /mnt/gentoo лежит полусобранная - страшно пока что дальше собирать (первый раз все-таки).

Может поможет инсталяция gcc 3.4, например, вместо 4.2? или все практическим путем проверяется?

ink
() автор топика
Ответ на: комментарий от Deprecated

>Пальцем в небо: может расширение файла io.c поменять на *.cc? )

g++ пофигу на расширение.

Demon37 ★★★★
()
Ответ на: комментарий от ink

>2) Не выход, если уж есть среда разработки, то она должна работать, например для собственных програм

dmatveev@satellite:robots$ wc -l `ls *.cpp | grep -v demo`
  327 commxfce.cpp
   99 factory.cpp
  150 game.cpp
   38 main.cpp
  597 netxfce.cpp
   72 object2d.cpp
  300 robot.cpp
  220 socket.cpp
  172 string.cpp
  415 ui.cpp
 2390 итого
dmatveev@satellite:robots$ grep cout *.cpp | grep -v demo | wc -l
78
dmatveev@satellite:robots$ time make clean robots | tail -n 1
g++ -O3 string.o socket.o main.o game.o robot.o factory.o ui.o netxfce.o  -o robots

real    0m6.682s
user    0m6.308s
sys     0m0.372s
dmatveev@satellite:robots$

Гы гы гы гы

yoghurt ★★★★★
()
Ответ на: комментарий от ink

Видать что-то не так с gcc. Жди обновлений. 

У самого не убунту, всё компилируется нормально.

$ g++ --version
g++ (Debian 4.3.3-4) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.

Demon37 ★★★★
()
Ответ на: комментарий от yoghurt

var=`cat /home/ink/bugaga/io.c` ${var//iostream/stdio} ${var//cout/printf} echo $var > /home/ink/bugaga/io.c

ink
() автор топика

Проверил на убунте 8.04, проблем нет. Ты делал apt-get install build-essential ? Хотя, вроде, нужные пакеты у тебя есть. И не перепутал ли gcc и g++?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

build-essential есть, не перепутал

ink
() автор топика

Никак не могу понять, на каком языке программа, которую пытается скомпилировать автор - C или C++ ? Ибо для С++ никакой wchar.h нах не нужен, а в случае C ни о каких cin/cout речи быть не может.

//ваш К.О.

d_a ★★★★★
()
Ответ на: комментарий от tzukko

> несовместимость библиотек и компилятора, и железячные проблемы.

OMFG! Поделка Шатлворта все же не настолько плоха, как некоторые думают.

d_a ★★★★★
()
Ответ на: комментарий от d_a

Судя по использованию команды g++, а не gcc следует что все же на С++, опыт показывает что wchar.h нужен, иначе я бы не подозревал о его существовании. Данный код на С никак не тянет:

#include <iostream> int main(){ std::cout<<"Preved"; return 0; }

Дабы не быть голословным еще раз выкладываю:

ink@ink-laptop:~/bugaga$ g++ ./io.c In file included from /usr/include/c++/4.2/cwchar:55, from /usr/include/c++/4.2/bits/postypes.h:46, from /usr/include/c++/4.2/iosfwd:49, from /usr/include/c++/4.2/ios:43, from /usr/include/c++/4.2/ostream:45, from /usr/include/c++/4.2/iostream:45, from ./io.c:1: /usr/include/wchar.h:527: error: expected initializer before ‘*’ token // остальные ошибки (все из wchar.h)

ink
() автор топика
Ответ на: комментарий от ink

Короче, все примеры отлично компилируются с помощью g++ как валидная C++ программа; и с #include <cwchar> (стандарт), и с #include <wchar.h>, и без них. У тебя тупо не стоят какие-то из заголовочников. Дуй в репозитории, и смотри, что забыл.

d_a ★★★★★
()
Ответ на: комментарий от Legioner

файлы с расширением ".c" тоже должен уметь обрабатывать, чтобы legacy код компилировать.

d_a ★★★★★
()
Ответ на: комментарий от Legioner

Дело не в этом, т.к. даже не g++, а линукс как ОС не привязывается к расширеням файлов.

Что ж, установка g++ 4.3 исправила ситуацию (теперь все работает), скорее всего что нехватало каких-то заголовочных файлов.

Всем спасибо за помощь!

ink
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.