> > А на что нацелен (void *)? > Сам по себе -- ни на что - это тип. А объект типа (void *) > нацелен на область нетипизированных данных. Другими словами [skipped]
> сути, всё равно, куда он указывает. Он имеет фиксированный > размер.
Это то все понятно. Просто есть стандартный тип, имеющий нулевой размер и указатели с ним вполне уживаются. Указатели на пустые типы тоже вполне могли бы жить (это я к тому, что указатели в никуда не являются проблемой, как было заявлено). К примеру так:
class base {};
class derived: public base {int a;}
Это не такой уж и надуманный пример, потому как base не обязательно должен быть пустым, единственное - он не должен иметь членов-данных. А функции-члены (в том числе и статические) - вполне. Например, реализовывать захват какого либо глобального ресурса в конструкторе.
> Порылся-таки в стандарте. Каюсь. Надо было сразу глянуть, а > не гадать. (ISO/IEC 14882)
Не в том стандарте рылся. :-) У тебя синтаксическая ошибка только в рамках СТАНДАРТНОГО синтаксиса C (стандарт ISO/IEC 9899:1999). Некоторые расширения понимают имя структуры без ключевого слова struct, но это не соответствует стандарту. Приведу отрывки из грамматики:
A.2.2 Declarations
(6.7) declaration:
declaration-specifiers init-declarator-listopt ;
(6.7) declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
[skipped]
(6.7.2) type-specifier:
void
char
short
int
long
float
double
signed
unsigned
_Bool
_Complex
_Imaginary
struct-or-union-specifier
enum-specifier
typedef-name
[skipped]
(6.7.2.1) struct-or-union-specifier:
struct-or-union identifieropt { struct-declaration-list }
struct-or-union identifier
(6.7.2.1) struct-or-union:
struct
union
(6.7.2.2) enum-specifier:
enum identifieropt { enumerator-list }
enum identifieropt { enumerator-list , }
enum identifier ---
Немого побилась разметка, так что не видно где терминалы, а где нет, но думаю это и так понятно из контекста. Если человеческим языком, то после объявления struct, union и enum ОБЯЗАТЕЛЬНЫ при использовании объявленных типов. То бишь после объявления
struct my_struct {
int a;
};
Обращаться к новосозданному типу можно ТОЛЬКО через struct my_struct. Все потому, что стандарт C не вводит имя структуры в глобальное пространство имен. Можешь попробовать сделать так:
#include <stdio.h>
struct test {
int a;
};
struct test test; // Объявление переменной test с типом struct test
int
main() {
return 0;
} ---
Любой компилятор C, который не скомпилирует этот код нарушает стандарт.
> Кратко - по-русски. В стандарте c++ заявлено, что классы > могут быть пустыми, а их объекты всегда должны быть > ненулевого размера. (напомню, что в c++ ключевыми словами > объявления класса являюстся class, structure, union).
> Так что, это является задокументированным стандартом для > C++. Относительно си - не знаю.
Это то все понятно. Я тоже нашел это в стандарте, только в разделе 1.8 C++ Object Model [intro.object]
5 Unless it is a bit-field (9.6), a most derived object shall have a non-zero size and shall occupy one or more bytes of storage. Base class sub-objects may have zero size. An object of POD4) type (3.9) shall occupy contiguous bytes of storage.
|