Любой не (char *) правильный способ инициализации void * из константной строки в C ++ - PullRequest
1 голос
/ 05 апреля 2011

Мне дали проект MSVC, который не работал с gcc. Особенно интересна эта ошибка:

    void * str;
    str = "data"; // error
    str = (char*)"data"; // working

Ошибка: Error: invalid conversion from ‘const void*’ to ‘void*’, поэтому g ++ (gcc 4.x) обрабатывает строку как const void, но как MSVC обрабатывает ее!?

Странный вопрос: есть ли другой способ заставить этот код работать на обоих компиляторах, не отходя от типа void, используя union или * _cast's? (Пожалуйста, ответьте со стандартами, я хочу дать что-нибудь поклонникам MSVC там:))

Ответы [ 4 ]

4 голосов
/ 05 апреля 2011

Строки - это массивы постоянных символов.Такой массив может быть преобразован в const char*.

Обратите внимание на квалификатор const: const char*, а не char*.Преобразование строкового литерала в char* является устаревшим (удалено в C ++ 0x) и небезопасным преобразованием.Вы должны сделать вашу цель const void*.

3 голосов
/ 05 апреля 2011

Вы в значительной степени ответили на свой вопрос.Для совместимости MSVC ++ позволяет использовать ту же лицензию, что и обычная C, для обработки строковых литералов типа char *, а не const char *.Чтобы он работал с gcc без исправления типов, вам нужно писать (char *)"data" везде, где у вас есть "data".Если вам не нравятся приведения в старом стиле, const_cast<char *>("data") также должен работать.

Если вы можете немного изменить типы, то, как говорит GMan, const void * должно сработать.

2 голосов
/ 05 апреля 2011

Не рассматривайте C-струны как void*. Вместо этого используйте const char*.

Но если у вас есть по историческим причинам, сделайте его константным указателем: const void* str = "data";

1 голос
/ 05 апреля 2011

«data» - это литерал типа const char [5], изменение константы - неопределенное поведение.

Вы можете использовать массив символов, выделенный в стеке:

char data[] = "example";
void* str = data;

Но почему вы пытаетесь это сделать?Есть гораздо более безопасные способы работы с текстом, например, std :: string, который реализует RAII для вас.

...