информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Портрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 ФБР нашла русский след в атаках... 
 Массовый взлом SharePoint 
 Microsoft Authenticator прекращает... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
ты ошибся 18.04.02 05:57  Число просмотров: 987
Автор: йцукенг <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