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