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 нет оператора; макроопределение это не оператор.
Есть некоторый класс, структура которого является записью в некоторой БД. Для проверки размерности структуры на этапе компиляции, делаю следующее:
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++] #if17.04.02 22:38 Автор: beetle <beetle> Статус: Member Отредактировано 18.04.02 10:46 Количество правок: 1
директиві препроцессора используются только с целью уменьшения размера бинарника(obj-файла).Судя по тому,что ті написал-не имеет смісла юзать енту директиву,так как війграша от нее никакого.А оператор sizeof видимо не распознается микрософтовским препроцессором.
Да ты что ?!17.04.02 22:56 Автор: PS <PS> Статус: Elderman
Новое слово в языке С ?
Открою маленький секрет: С - это компилятор, а не интерпретатор, и стадия исполнения идет отдельно от стадии компиляции.
А что касается подщета размера структуры на этапе препроцессора - очень плохая идея. И правильно что эту возможность не включили в реализацию.
Ключевое слово: "выравнивание".
Чем плох подсчет на этапе препроцессора?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