информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяСетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Это синтаксическая ошибка :-) 22.11.05 12:07  Число просмотров: 1688
Автор: amirul <Serge> Статус: The Elderman
Отредактировано 22.11.05 12:08  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
> > А на что нацелен (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.
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach