Из интерфейса программирования Linux
execl(prog, arg, (char *) 0); execl(prog, arg, (char *) NULL);
Обычно требуется приведение
NULL
к последнему вызову выше, даже в реализациях, гдеNULL
определяется как(void *) 0
.Это связано с тем, что, хотя стандарты C требуют, чтобы нулевые указатели разных типов проверялись на равенство при проверке на равенство, они не требуют, чтобы указатели разных типов имели одинаковое внутреннее представление (хотя в большинстве реализаций так и есть).
Кроме того, в вариационной функции компилятор не может привести(void *) 0
к нулевому указателю соответствующего типа.Стандарты C делают одно исключение из правила, согласно которому указатели разных типов не обязательно должны иметь одинаковое представление: указатели типов
char *
иvoid *
должны иметь одинаковое внутреннее представление. Это означает, что передача(void *) 0
вместо(char *) 0
не будет проблемой в примере сexecl()
, но в общем случае требуется приведение.
«Обычно требуется приведение
NULL
в порядке последнего вызова выше»Требует ли стандарт C, чтобы нулевой указатель был представлен так же, как
(char*) 0
?«в вариационной функции, такой как
execl()
, компилятор не может привести(void *) 0
к нулевому указателю соответствующего типа».Разве
(void *) 0
не является нулевым указателем типа?Если да, то почему компилятор не может преобразовать
(void *) 0
вexecl(prog, arg, (void*) 0)
в "нулевой указатель соответствующего типа"?"указатели типов
char *
иvoid *
должны иметь одинаковое внутреннее представление. Это означает, что передача(void *) 0
вместо(char *) 0
не будет проблемой в примере сexecl()
".Может ли теперь компилятор привести
(void *) 0
вexecl(prog, arg, (void*) 0)
к "нулевому указателю соответствующего типа"?Почему это противоречит цитате в моем пункте 2?
Если я заменю
(void *) 0
вexecl(prog, arg, (void*) 0)
на приведение 0 к указателю любого типа, например(int *) 0
, сможет ли компилятор привести(int *) 0
вexecl(prog, arg, (int*) 0)
к "нулевому указателю соответствующего типа"? Спасибо.Может ли компилятор для невариативного вызова функции, такого как
sigaction(SIGINT, &sa, (int*) 0)
, преобразовать(int *) 0
в "нулевой указатель соответствующего типа"?
Спасибо.
execl()
иsigaction()
определены в POSIX.1-2008 стандарт, также известный как IEEE Std 1003.1-2008. Попробуйте добавить тег posix. - person Nominal Animal   schedule 06.09.2018