Re[4]: #pragma pack(3)
От: Кодт Россия  
Дата: 07.06.10 15:14
Оценка:
Здравствуйте, Erop, Вы писали:

К>>То есть, целиком проигнорировал первую прагму и, как следствие, выругался на якобы непарную вторую.

К>>После чего выравнял всё по дефолту на 4.
E>Это, типа, лучше?

Это, типа, тоже хреново, но продвинуть варнинг до еррора — плёвое дело.
Перекуём баги на фичи!
Re: #pragma pack(3)
От: Кодт Россия  
Дата: 07.06.10 15:33
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Вот, такой вот глюк. Падает также при всех значениях, отличных от [1,2,4,8,16]


Забавно, что валится строго на #pragma pack(push,n) где n — левое.
Если сделать push, затем n, затем pop — всё в порядке.


Засада: gcc тоже понимает #pragma pack, но считает #pragma pack(push) невалидной.
#pragma pack(push,n) / #pragma pack(pop) — это совместимый код.
Перекуём баги на фичи!
Re[5]: #pragma pack(3)
От: dmitry_npi Россия  
Дата: 07.06.10 18:28
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%AD%D0%92%D0%9C


Не, ну вы даёте Вообще дело было так. Досталась мне программа, которая читает свои файлы определенного формата. Блоками сразу в структуры. И смотрю, какая-то ерунда. Поставил выравнивание "1" — стало нормально. Потом просто поигрался с прагмой — я не очень понимал это выравнивание. И тут ВНЕЗАПНО, как говорится, пришла мысль — напишу-ка число 3, каково ему будет? А он упал. Потом попробовал -6. Не скомпилил.
Атмосферная музыка — www.aventuel.net
Re[2]: #pragma pack(3)
От: dmitry_npi Россия  
Дата: 07.06.10 20:11
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Минимальный код и флаги можно увидеть? На 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>
Атмосферная музыка — www.aventuel.net
Re[3]: #pragma pack(3)
От: Кодт Россия  
Дата: 07.06.10 22:35
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

ЮЖ>>Минимальный код и флаги можно увидеть? На VC++ 2008 SP1 воспроизвести не удалось.

_>Минимальнейший пример (вывод на консоль):

_>
_>#pragma pack(push, 3)
_>


Вот ключевой момент.
Если написать просто #pragma pack(3) — не упадёт, а проигнорирует.

Минимальный код выглядит вообще так
#pragma pack(push,3) // только в таком виде
struct X { int a; }; // нужна хоть какая-нибудь структура - предмет для вываливания в ICE.

Валится на всех версиях VC.
Перекуём баги на фичи!
Re[2]: #pragma pack(3)
От: Alexander G Украина  
Дата: 09.06.10 13:27
Оценка: 41 (2) :))
Здравствуйте, Кодт, Вы писали:


К>Забавно, что валится строго на #pragma pack(push,n) где n — левое.

К>Если сделать push, затем n, затем pop — всё в порядке.

К>Засада: gcc тоже понимает #pragma pack, но считает #pragma pack(push) невалидной.

К>#pragma pack(push,n) / #pragma pack(pop) — это совместимый код.

Таким образом, желающие странного могут писать:


#pragma pack(push,1)
#pragma pack(3)
...
#pragma pack(pop)
Русский военный корабль идёт ко дну!
Re[6]: #pragma pack(3)
От: тыдыщъх  
Дата: 09.06.10 20:13
Оценка: :))
Здравствуйте, dmitry_npi, Вы писали:

>>как говорится, пришла мысль — напишу-ка число 3, каково ему будет? А он упал. Потом попробовал -6. Не скомпилил.


— Ага! — сказали суровые сибирские мужики.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.