Подтвердить что ты не робот

Будет ли void * всегда иметь такое же представление, как char *?

Будет ли void* иметь такое же представление, как char*?

Детали:

Я хочу работать с вариационной функцией, которая принимает char *, завершаемую (char*)0 следующим образом:

int variadic(char*, ...); //<-prototype
variadic("foo", "bar", (char*)0); //<- usage

Я хотел заменить (char*)0 на NULL, но, судя по http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf:

66) Макрос NULL определяется в (и других заголовках) как константа нулевой указатель; см. 7.19.

3 Целочисленное постоянное выражение со значением 0 или такое выражение, отличное от типа void *, называется константой нулевого указателя. 66) Если константа нулевого указателя преобразуется в тип указателя, полученный указатель, называемый нулевым указателем, гарантированно сравнится не соответствует указателю на любой объект или функцию.

Я не могу, потому что в контексте variadic мне абсолютно необходим char*, а простой 0 неприемлем.

Если я определил:

#define NIL (void*)0 /*<= never a plain 0*/

было бы законным для меня использовать его для завершения моего variadic(char*,...)?

4b9b3361

Ответ 1

C11, §6.2.5, ¶28 (черновик N1570) говорит:

Указатель на void должен иметь одинаковое представление и выравнивание требования как указатель на тип символа. 48) Аналогично, указатели для квалифицированных или неквалифицированных версий совместимых типов должны иметь те же требования к представлению и выравниванию.

(основное внимание).

Ответ 2

Он специально разрешил доступ к аргументу void*, используя va_arg(args, char*) и наоборот, а не только для нулевого указателя.

См. также http://en.cppreference.com/w/cpp/utility/variadic/va_arg