LINUX.ORG.RU

GNU C++ и Unicode строки


0

1

Есть простейшая программа, выводит Unicode-строку:

#include <stdio.h>
#include <wchar.h>

wchar_t my_message[] = {'H', 'e', 'l', 'l', 'o', '\n', 0x00};

int main(int argc, char* argv[])
{
wprintf(my_message);
return 0;
}

Компилируем ее с помощью GNU C:

$ gcc wprintf.c -o wprintf

Все в порядке... Создается исполняемый файл wprintf, который при запуске выводит строку "Hello".

Попробуем компилировать с помощью GNU C++:

$ g++ wprintf.c -o wprintf
wprintf.c: In function `int main (int, char **)':
wprintf.c:8: `wprintf' undeclared (first use this function)
wprintf.c:8: (Each undeclared identifier is reported only once for each
function it appears in.)

WTF?! Почему GNU C++ не видит функцию wprintf?
То же самое и с другими стандартными C-функциями для Unicode строк (например, swprintf).

Пробовал следующее:
1. Использовать extern "C" при подключении wchar.h в исходнике:

extern "C" {
#include <wchar.h>
}

2. Указывать библиотеку libstdc++ при компиляции:

g++ wprintf.c -o wprintf -lstdc++

Ни то, ни другое не помогло.

> wchar_t my_message[] = {'H', 'e', 'l', 'l', 'o', '\n', 0x00};

В данном конкретном случае это не важно, но правильно всё-таки так:

wchar_t my_message[] = {L'H', L'e', L'l', L'l', L'o', L'\n', L'\0'};

а так

wchar_t my_message[] = L"Hello\n";

ещё и удобнее =).

> WTF?! Почему GNU C++ не видит функцию wprintf?


Какая версия GCC и glibc? Вообще эта функция входит в стандарт C99 и g++ её видеть не обязан (в хедере есть что-то типа #ifdef C99 ... #endif). Тем не менее у меня g++ 4.3.3 нормально собирает твой код.

> Ни то, ни другое не помогло.


Если открыть man wprintf, то там можно увидеть такие строки:

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

All functions shown above: _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE; or cc -std=c99

Попробуй добавить указанные дефайны _до_ директив #include или опцией компилятора -D.

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

> #include <cstdio>
> #include <cwchar>


> using namespace std;


Точно, так даже правильней будет.

Deleted
()

p.s. хотя и твой вариант, с чисто-сишными инклудами у меня компилится и работает. 

$ g++ -v
Спецификации прочитаны из /usr/lib/gcc/i486-slackware-linux/4.2.4/specs
Целевая архитектура: i486-slackware-linux
Параметры конфигурации: ../gcc-4.2.4/configure --prefix=/usr --enable-shared --enable-languages=ada,c,c++,fortran,java,objc --enable-threads=posix --enable-__cxa_atexit --disable-checking --with-gnu-ld --verbose --with-arch=i486 --target=i486-slackware-linux --host=i486-slackware-linux
Модель многопотоковости: posix
gcc версия 4.2.4

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

>Спецификации прочитаны из...

Русский g++ - НЕНАВИСТЬ!!!!1111

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

> Какая версия GCC и glibc? Вообще эта функция входит в стандарт C99 и g++ её видеть не обязан (в хедере есть что-то типа #ifdef C99 ... #endif). Тем не менее у меня g++ 4.3.3 нормально собирает твой код.

GCC 2.9.6

Разобрался. В этой версии для использования Unicode-строк нужно включать #define _GNU_SOURCE 1 в начало исходника и компилировать с ключом -Wall.

Блин, надо срочно переходить на новую версию Linux'а. На дистрибутиве 2001 года просто невозможно работать.

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