Здравствуйте, Erop, Вы писали:
К>>То есть, целиком проигнорировал первую прагму и, как следствие, выругался на якобы непарную вторую. К>>После чего выравнял всё по дефолту на 4. E>Это, типа, лучше?
Это, типа, тоже хреново, но продвинуть варнинг до еррора — плёвое дело.
Не, ну вы даёте Вообще дело было так. Досталась мне программа, которая читает свои файлы определенного формата. Блоками сразу в структуры. И смотрю, какая-то ерунда. Поставил выравнивание "1" — стало нормально. Потом просто поигрался с прагмой — я не очень понимал это выравнивание. И тут ВНЕЗАПНО, как говорится, пришла мысль — напишу-ка число 3, каково ему будет? А он упал. Потом попробовал -6. Не скомпилил.
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Минимальный код и флаги можно увидеть? На VC++ 2008 SP1 воспроизвести не удалось.
Минимальнейший пример (вывод на консоль):
Setting environment for using Microsoft Visual Studio 2008 x86 tools.
C:\Program Files\Microsoft Visual Studio 9.0\VC>cd \temp
C:\temp>copy con test.cpp
#pragma pack(push, 3)
struct X
{
char a;
bool b;
int i;
};
#pragma pack (pop)
int main()
{
return 0;
}
^Z
Скопировано файлов: 1.
C:\temp>cl test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
test.cpp(1) : warning C4086: expected pragma parameter to be '1', '2', '4', '8',
or '16'
test.cpp(5) : fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'msc1.cpp', line 1411)
To work around this problem, try simplifying or changing the program near the l
ocations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Internal Compiler Error in C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\c
l.exe. You will be prompted to send an error report to Microsoft later.
C:\temp>
Здравствуйте, dmitry_npi, Вы писали:
ЮЖ>>Минимальный код и флаги можно увидеть? На VC++ 2008 SP1 воспроизвести не удалось. _>Минимальнейший пример (вывод на консоль):
_>
_>#pragma pack(push, 3)
_>
Вот ключевой момент.
Если написать просто #pragma pack(3) — не упадёт, а проигнорирует.
Минимальный код выглядит вообще так
#pragma pack(push,3) // только в таком видеstruct X { int a; }; // нужна хоть какая-нибудь структура - предмет для вываливания в ICE.
К>Забавно, что валится строго на #pragma pack(push,n) где n — левое. К>Если сделать push, затем n, затем pop — всё в порядке.
К>Засада: gcc тоже понимает #pragma pack, но считает #pragma pack(push) невалидной. К>#pragma pack(push,n) / #pragma pack(pop) — это совместимый код.
Здравствуйте, dmitry_npi, Вы писали:
>>как говорится, пришла мысль — напишу-ка число 3, каково ему будет? А он упал. Потом попробовал -6. Не скомпилил.