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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
ты ошибся 18.04.02 05:57  Число просмотров: 961
Автор: йцукенг <jcukeng> Статус: Member
<"чистая" ссылка>
1. > > > if(sizeof(yourstruct)<=>CONST)
2. > > > #define WRONG_STRUCT_SIZE
3. > > > else
4. > > > .....
5. > > > #ifdef WRONG_STRUCT_SIZE
6. > > > #error(message)
7. > > > #endif
> >
> > Новое слово в языке С ?
> єто ті о чем?
это он написал к тому, что ты работу компилятора неправильно понимешь:)
сначала работает препроцессор, который заменяет все макроопределения, а лишь потом - собственно компилятор.
т.е. строки 2,5,6,7 обрабатываются препроцессором. и, таким образом, макрос WRONG_STRUCT_SIZE всегда будет определен.
в свете вышесказанного компилятор должен ругнуться на строку 2.
с его точки зрения там написано:
if(sizeof(yourstruct)<=>CONST)
else
...
ведь между if и else нет оператора; макроопределение это не оператор.
<programming>
[C++] #if 17.04.02 18:35  
Автор: Green Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Есть некоторый класс, структура которого является записью в некоторой БД. Для проверки размерности структуры на этапе компиляции, делаю следующее:

class DB_REC
{
...............
};

#if (sizeof(DB_REC) !=176)
#error <"DB_REC" HAS INVALID SIZE>
#endif

В ВС4.5 это работает, а в VC++ - нет. В MSDN четко сказано: "The expression cannot use sizeof or a type-cast operator."
Так может всё же есть какой-нибудь способ подобной проверки на этапе компиляции?
[C++] #if 17.04.02 22:38  
Автор: beetle <beetle> Статус: Member
Отредактировано 18.04.02 10:46  Количество правок: 1
<"чистая" ссылка>
директиві препроцессора используются только с целью уменьшения размера бинарника(obj-файла).Судя по тому,что ті написал-не имеет смісла юзать енту директиву,так как війграша от нее никакого.А оператор sizeof видимо не распознается микрософтовским препроцессором.
Да ты что ?! 17.04.02 22:56  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
> if(sizeof(yourstruct)<=>CONST)
> #define WRONG_STRUCT_SIZE
> else
> .....
> #ifdef WRONG_STRUCT_SIZE
> #error(message)
> #endif

Новое слово в языке С ?
Открою маленький секрет: С - это компилятор, а не интерпретатор, и стадия исполнения идет отдельно от стадии компиляции.

А что касается подщета размера структуры на этапе препроцессора - очень плохая идея. И правильно что эту возможность не включили в реализацию.
Ключевое слово: "выравнивание".
Чем плох подсчет на этапе препроцессора? 18.04.02 12:43  
Автор: Green Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> А что касается подщета размера структуры на этапе
> препроцессора - очень плохая идея. И правильно что эту
> возможность не включили в реализацию.
> Ключевое слово: "выравнивание".

Ну а если так?

#pragma pack(push,1)
class DB_REC
{
...............
};
#pragma pack(pop)

#if (sizeof(DB_REC) !=176)
#error <"DB_REC" HAS INVALID SIZE>
#endif

Мне главное, чтоб он размер структуры проверял.
Тем что это не его дело. 18.04.02 13:52  
Автор: PS <PS> Статус: Elderman
Отредактировано 18.04.02 16:09  Количество правок: 1
<"чистая" ссылка>
Пусть даже ты использовал прагму (хотя за одно это надо по рукам давать), и пусть препроцессор, знает, что для даной структуры выравнивания нет, и пусть даже препроцессор знает сколько байт занимает тот или иной тип (хотя не должен знать - не его это вотчина !), но что он тогда выдаст на такую запись:
struct s2
{
	int b;
	char a;
};

#pragma pack(push,1) 
struct s
{
	int b;
	char a;
	struct s2 d;
};
#pragma pack(pop) 

---

По твоему сдесь он должен залезть в ключи компилятора (к которому он ну никакого отношения не имеет), узнать размер выравнивания, рекурсивно пробежатся по структуре s, подсчитать размер... вообщем занятся явно не своим делом.
Ну хорошо, а если ты запустишь ТОЛЬКО препроцессор. Так что бы он сгенерил текст, который ты потом отдаш компилятору ? Как он тогда получит размер стуктуры ?
Вообщем сплошные неоднозначности и вопросы. А все из-за того что по определению тупой модуль пытаемся заставить думать.
Да ты что ?! 18.04.02 01:40  
Автор: beetle <beetle> Статус: Member
<"чистая" ссылка>
> > if(sizeof(yourstruct)<=>CONST)
> > #define WRONG_STRUCT_SIZE
> > else
> > .....
> > #ifdef WRONG_STRUCT_SIZE
> > #error(message)
> > #endif
>
> Новое слово в языке С ?
єто ті о чем?
> Открою маленький секрет: С - это компилятор, а не
> интерпретатор, и стадия исполнения идет отдельно от стадии
> компиляции.
спасибо -ті откріл мне тайну.Я всегда думал,что С-енто такая хитрая программа,которая передает специальной штучке в моем мониторе команді,и монитор показівает програмки разние =))
> А что касается подщета размера структуры на этапе
> препроцессора - очень плохая идея. И правильно что эту
> возможность не включили в реализацию.
согласен на все 100%
> Ключевое слово: "выравнивание".
??????????????
ты ошибся 18.04.02 05:57  
Автор: йцукенг <jcukeng> Статус: Member
<"чистая" ссылка>
1. > > > if(sizeof(yourstruct)<=>CONST)
2. > > > #define WRONG_STRUCT_SIZE
3. > > > else
4. > > > .....
5. > > > #ifdef WRONG_STRUCT_SIZE
6. > > > #error(message)
7. > > > #endif
> >
> > Новое слово в языке С ?
> єто ті о чем?
это он написал к тому, что ты работу компилятора неправильно понимешь:)
сначала работает препроцессор, который заменяет все макроопределения, а лишь потом - собственно компилятор.
т.е. строки 2,5,6,7 обрабатываются препроцессором. и, таким образом, макрос WRONG_STRUCT_SIZE всегда будет определен.
в свете вышесказанного компилятор должен ругнуться на строку 2.
с его точки зрения там написано:
if(sizeof(yourstruct)<=>CONST)
else
...
ведь между if и else нет оператора; макроопределение это не оператор.
сдаюсь-честно говоря давно не юзал макроопределений 18.04.02 10:45  
Автор: beetle <beetle> Статус: Member
<"чистая" ссылка>
1




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


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