# Unity can't #define #pragma pack?

## Recommended Posts

bpoint    464
Hello all, I am trying to find a way to set up structure packing using #define macros while also being compiler-independant. Ideally, something like this would be great:
MYSTRUCTPACK(1) struct
{
char foo;
int bar;
} hoge;


However, MSVC (and other compilers) use a #pragma with a push and pop syntax, rather than a _declspec like they use for alignment, so I've resigned myself that this is probably the best I'd ever be able to do:
MYSTRUCTPACK_BEGIN(1)

struct
{
char foo;
int bar;
} hoge;

MYSTRUCTPACK_END()


Unfortunately, MSVC doesn't like me using a #define to declare #pragma pack:
#define MYSTRUCTPACK_BEGIN(x)     #pragma pack(push, x)    // error C2162: expected macro formal parameter

After much fruitless searching on Google, I did manage to find one thread here on gamedev where Null and Void pointed out how CPT handles this issue. The only problem with using a #include to wrap a structure is that I wouldn't be able to specify the desired packing (1, 2, 4, 8, 16, etc) unless I created multiple include files each with a different values. That post was made back in 2002. Is there any better way to do this 4 years later that I'm just not aware of?

##### Share on other sites
Roboguy    794
You cannot define a macro which uses the preprocessor.

##### Share on other sites
Quote:
 Original post by RoboguyYou cannot define a macro which uses the preprocessor.

What?

// ---------------------------------------------------------------------------// use the preprocessor to turn a symbol into a string#define STR(x) #x#define STRING(x) STR(x)

bpoint, it might require using a set of 8 headers - before and after for each possibility.

##### Share on other sites
Roboguy    794
Quote:
Quote:
 Original post by RoboguyYou cannot define a macro which uses the preprocessor.

What?

*** Source Snippet Removed ***

I meant you can't issue preprocessor directives, like #pragma in a macro.

##### Share on other sites
bpoint    464
Okay, I've played with it some more and managed to get a bit farther. MSDN docs say:
Quote:
 Following #pragma, write any text that the translator can parse as preprocessing tokens. The argument to #pragma is subject to macro expansion.

So I can whip up something like this:

#define MYPACK_BEGIN(x)				pack(push, x)#define MYPACK_END					pack(pop)#pragma MYPACK_BEGIN(1)struct{    char foo;    int bar;} hoge;#pragma MYPACK_END

This would also work for other compilers, assuming that they allow macro substitution after the #pragma. However, this leaves out GCC which decided to be "different" and use the __attribute__ syntax instead of a #pragma...

I then decided to see if I could use string substitution in a macro to create a header filename like so:

#define MYPACK2(x)					"PackHeader" #x ".h"#include MYPACK2(4)      // warning C4067: unexpected tokens following preprocessor directive - expected a newline                          // fatal error C1083: Cannot open include file: 'PackHeader': No such file or directory

But this doesn't seem to work either.

Does anyone have any other ideas (even if they are hackish)? Or am I just going to have to break down and make include files for each packing alignment I need, like LessBread has suggested?

Thanks for the tips, guys.

##### Share on other sites
Roboguy    794
Quote:
 Original post by bpointHowever, this leaves out GCC which decided to be "different" and use the __attribute__ syntax instead of a #pragma...

No it didn't, #pragmas are compiler-specific.

##### Share on other sites
bpoint    464
Quote:
 Original post by RoboguyNo it didn't, #pragmas are compiler-specific.

Indeed they are. However, GCC certainly could have implemented structure packing the same way every other compiler has done it, rather than being different.

Actually, I prefer the __attribute__ syntax myself. But unfortunately everyone else uses #pragma already...

##### Share on other sites
Quote:
Original post by Roboguy
Quote:
Quote:
 Original post by RoboguyYou cannot define a macro which uses the preprocessor.

What?

*** Source Snippet Removed ***

I meant you can't issue preprocessor directives, like #pragma in a macro.

It seems to me that #pragma is a compiler directive not a preprocessor directive. However, microsoft appears to categorizes it as a preprocessor directive, which might explain why bpoint ran in to trouble with MSVC. I don't have a copy of the standard at hand to check, maybe someone else does.

##### Share on other sites
bpoint    464
It seems that since gcc-4.0, gcc supports #pragma pack for compatibility with Win32.

If that's the case then all I need to is ensure MetroWorks and GCC will allow me to #define the text after the pragma. I'm not at home now, so I'll try testing this theory later tonight.

##### Share on other sites
Uhm, it seems you didn't read the MSDN, or i am missing something... __declspec(align(X)) seems to be the thing you are looking for, or am i wrong?

On the other hand, if you want to go with includes, then your attempt (bellow) is wrong.
#define MYPACK2(x) "PackHeader" #x ".h"#include MYPACK2(4)

What you should do is something like this:
#define		STRINGIZE(X) #X#define		PACK(X) STRINGIZE(pack##X##.h)#define		PACK_END "packend.h"

[Edited by - Paulius Maruska on August 17, 2006 3:32:33 AM]

##### Share on other sites
bpoint    464
Quote:
 Original post by Paulius MaruskaUhm, it seems you didn't read the MSDN, or i am missing something... __declspec(align(X)) seems to be the thing you are looking for, or am i wrong?

Structure packing is not the same as alignment.

Structure packing ensures that variables within a structure are aligned to a specific memory address. In my example above, sizeof(hoge) would be 5 if packing was set to 1, or 8 if packing was set to 4.

Alignment (using __declspec) is what aligns the variable itself to a specific memory address. For example, I could align my structure to 16 bytes, so that anywhere it was used the address would be properly aligned.

Alignment can also be specified along with packing, so I could feasibly have a 5 byte sized struct that is 16 byte aligned in memory.

Hope this helps. :)

##### Share on other sites
Guest Anonymous Poster
You can use _Pragma operator to do this. It is defined in standard (#16.9 Pragma operator).
I have tested it with GCC 4.2.0,4.0.2,4.1.0,3.4.5 and 3.3.6 and it works perfectly

#include <cstdio>#define PACK _Pragma("pack(push,1)")#define UNPACK _Pragma("pack(pop)")PACKstruct MyStruct {	char m_test[3];	int m_test2;	short m_test3;};UNPACKint main(void) { 	printf("sizeof(struct MyStruct): %u\n",sizeof(struct MyStruct));	return 0;}

##### Share on other sites
Quote:
 Original post by bpointStructure packing is not the same as alignment.<...>Hope this helps. :)

Sorry, i'l note that for the future.

Quote:
 Original post by APYou can use _Pragma operator to do this. It is defined in standard (#16.9 Pragma operator).I have tested it with GCC 4.2.0,4.0.2,4.1.0,3.4.5 and 3.3.6 and it works perfectly

It doesn't work in MSVC8 - i've tested it...

So anyway, you can still use something like this (as in my previous post):
#define		STRINGIZE(X) #X#define		PACK(X) STRINGIZE(pack##X##.h)#define		PACK_END "packend.h"#include PACK(2)struct MyStruct {  int x, y, z;  double a, b, c;};#include PACK_END

Note, however, Visual C++ will issue a warning C4103 if header changes packing. Don't know if other compilers complains about it.

##### Share on other sites
bpoint    464
That would be an absolutely ideal solution if VS2005 (and everybody else) supported it...
Quote:
 error C4430: missing type specifier - int assumed. Note: C++ does not support default-interror C2440: 'initializing' : cannot convert from 'const char [13]' to 'int'error C2143: syntax error : missing ';' before ''error C2448: '_Pragma' : function-style initializer appears to be a function definition

Unfortunately I can't just make a special case for GCC since I need to have a #pragma before the #defined pack macro.

Maybe the next generation of compilers will have a better (and more standardized) way of handling this. But I'm not holding my breath. :)

##### Share on other sites
Evil Steve    2017
I belive Microsoft has several headers called things like "pshpk8" and "pshpk16" and so on, which does exactly what you described for #includes.

Personally, I'd just go with the #includes, it's probably easiest.

##### Share on other sites
bpoint    464
Quote:
 Original post by Evil StevePersonally, I'd just go with the #includes, it's probably easiest.

Yep, that really looks like the best choice. Since CodeWarrior uses #pragma option align=[some text], I wouldn't be able to properly set the structure packing with the MetroWerks compiler. Also using headers allows me to disable that pesky warning under MSVC. :)

Thanks to Paulius Maruska! I didn't realize my preprocessor stringizations were wrong.

## Create an account

Register a new account

• ### Similar Content

•
Intro - "The challenges of dynamic system design"
Custom Quest evolved during development, from a minor quest system used for our own needs in our own game production Quest Accepted, to something entirely more dynamic and customizable, now finally released, these are our thoughts on quest design and developing standalone subsystems.
Splitting what is a major production for a small indie team, into smaller installments such as a quest system was a good idea we thought, this way we can get some releases out there and fuel the development of our game. But building a system that works for yourself is one thing, building a unity plugin that will let other developers create quests, missions, and objectives, you would never have thought of is something else entirely.
The first thing we had to realize was that when building a quest system, the task is not to design great quests, the task is to enable the users to create great quests.
That still meant we had to find out what good quest design is and what a quest really is.
Our task was to create a system where the user is free to create creative engaging and rewarding mission experiences for their players.
What is a quest? - "Cut to the core"
First off, we need to know what a quest really is.
A quest is the pursuit, search, expedition, task or assignment a person(s) does in order to find, gain or obtain something.
In games, quests and missions function in many different ways depending on the genre.
A single game can contain a multitude of different types of quests put together in just as many ways. In an MMO, for instance, quests are vehicles for the story and the player's progression. In many cases they are formulaic and simple, some can even be repeated, there are hundreds of them and everyone can do them. In other games quests are for single player campaigns only, here they shape each level giving the player a sense of purpose.
Quests can span the whole game or just be a minor optional task on the way, there are so many design philosophies and creative quest designs that we had to narrow it down and really cut to the core of what is needed for good quest design.
What all quests have in common is the task, the criteria for successful completion of the quest, and the reward, the goal of the quest, what the player gets out of doing what we ask of him.
Quests cover an incredible variety of tasks so it was important for us to base our decisions on thorough research. In our research, we found that there are three layers to quest design.
The type, the pattern and the superstructure.
Quest types exist within quest patterns and quest patterns exist within the quest superstructure.
We found that there are 8 basic types of quests these are the various tasks/criteria the player must do in order to complete the specific quest.
There are 12 quest patterns. These are ways designers can use their quests, connect multiple quests set them up in engaging ways or teach players how to interact with and get the most out of the game world creating variety and engaging the player.
Enveloping the patterns is the quest superstructure, the overall structure of quests in the game, we found that there are two main ways of structuring your quests.
Historically quest have a quest giver, an NPC or object that informs the player about the quest, what they need to do, the story behind it and perhaps even what their reward will be should they complete the quest.
Quest types - "Do this, do that"
The core task each quest consists of, the criteria for completing part of or all of a single quest. These are the actions we want Custom Quest to be able to handle.
Kill
Probably the most basic quest type, the task is to kill something in the game, for example; kill 10 goblins. Gather
Again very simple, the task is to gather x things in the game world, collecting berries or the like. Escort
The player must escort or follow a person or object from point A to B while keeping it safe. FedX
The player is the delivery boy, they must deliver an item to a person or point. Defend
The player has to defend a location from oncoming enemies, often for a set number of waves or time. Profit
The player must have a certain amount of resources to complete the quest, contrary to gather quests these resources are resources the player would otherwise be able to use himself. Activate
The player's task is to activate/interact with one or more objects in the game world or talk to a number of NPC’s. In some cases, this must be done in a certain order for a puzzle effect. Search
Search an area, discover an area of the game world. This is useful for introducing areas of the map to the player and giving them a sense of accomplishment right off the bat, showing them a new quest hub or the like. Quest Patterns - "An engaging experience"
Tasks are one thing, and in many games, that might be plenty but we wanted custom quest to let the users create chains of quests, specialize them and set them up in ways that draw the player into the experience, there are many ways to go about this.

The most basic quest pattern, the quest chain starts out broad and easy, the player has to kill some low-level cronies. The next quest is narrower, the player must kill fewer but tougher enemies, lets say the boss' bodyguards. The last quest is the boss fight, the player has killed the gang and can now kill the boss. This quest pattern is very straightforward and works well, giving rewards either at every stage or only when the boss is dead.
Side stub
A side stub is an optional part of the overlapping quest. Lets say quest A leads to quest C but there is an option to complete a side objective B, which makes completing C easier or it changes the reward, for example. The player must escape prison, the side stub is “free the other prisoners” in this example escaping with all the prisoners is voluntary but it might make it easier to overpower the guards or the prisoners might reward the player when he gets them out. The side stub differs from a generic side quest in that it is tied to the main quest directly.
Continuous side-quests
These are side-quests that evolve throughout the game, one unlocks the next, but they are also affected by external requirements such as story progress. This pattern is often found with party members in RPG games, where the player must befriend the party member to unlock their story quests.

As the name implies these quests are time sensitive. The task can be of any type, the important thing is that the quest fails if time runs out. This could also be used for a quest with a side quest where the side quest is timed for extra rewards but the main objective is not.

Deja-vu quests
This kind of quest pattern gives the player a quest they have done or seen before. In some cases, this “new” quest will have a twist or something that sets it apart. It can also be the same sort of quest that exists in different areas of the game world, perhaps there is more than one goblin camp? or perhaps the player has to pick berries daily.

Delayed impact
Delayed consequences of a previous decision. Often used in games where the story is important and the players’ choices matter. These quests are tied together without the player knowing. Let's say the player is set the optional task of giving a beggar some gold to feed himself. The player gives the beggar a few gold and is on his way. The next time he meets the beggar the beggar has become rich and rewards the player for his kindness with ten times what he gave.
One of many
The player is presented with a number of quests, they have to choose which one to complete, they can only choose one. The others will not be available.

Hidden quests
Hidden tasks that aren’t obviously quests at first glance or are hidden away for only the most intrepid players to find. This could be an item the player picks up with an inscription in it if the player then finds the person the inscription is about he can get a reward for delivering it. A good quest pattern for puzzles, these kinds of quests can really make the game world come alive and feel a lot more engaging, allowing the player to uncover secrets, Easter eggs and discover all of the world created for them
Moral dilemma
Punish the bread thief who stole to feed his family? often used in games that have a good/ evil alignment level for the players, these kinds of quests make the player make a choice about what kind of character they want to play, they get to choose if their character is good or evil.

Side quests
Optional quests, these quests are often found in level based games where the overall quest must be completed to get to the next level, the player can optionally do some extra tasks to get more points. The important part is that these are optional but they give the player a reward for, getting everything they can out of the game.

Tournament
Tournament style quests, a series of quests that get harder as the player progresses. An example could be a gladiatorial arena if the player defeats five enemies one after the other he gets rewarded as the champion of the arena, but if for example, he fails at the third, the whole tournament is failed and he has to start all over from quest 1.

Vehicle missions
Despite the name these quests are not confined to being about cars, these are simply quests where the players control scheme changes to complete the quest(s). An example could be; changing from running around in the game world to driving a tank to destroy a fort.
Quest superstructure - "The whole package"
With quest superstructures, we are venturing into general game design. The superstructure is how the player is allowed to complete quests in the game world. It's basically a question of whether the game is “open world” or a linear experience.

The diamond structure
The open world model, think games like The Elder Scrolls V: Skyrim, the player is introduced to the game through a quest, but after that, they can go wherever and do whatever quests they want. There are tons of quests of the above types and patterns, the player is free to pick and choose which to do, giving the player the illusion of freedom within the game world (the diamond). However, the game still ends by completing a quest that is locked and always a requirement to complete the game. This can, of course, be varied by different choices the player has made throughout the game or even have multiple endings. Quests can be concentrated into quest hubs, i.e. towns with lots to do or the like, but they don't have to be completed in a linear fashion

Linear hub structure
This structure consists of a number of required “bridge” quests that need to be completed in order to unlock the next area or “hub”, each hub can have any number of quests, this could be a town full of people in trouble, each with their own quests and quest chains to complete, when they are all done, the player moves on to the next hub through another bridge quest. Limiting the quest size of the hubs will make the quest structure feel more linear and thereby the game linear, and creating larger more open hubs can make the player feel freer.

Outcome - "So many options!"
The development of custom quest has been the quest to allow game developers to create quests and missions that use these types. However, no matter how well we have researched, some one will come up with a new and creative way of doing quests.

The solution for us was to make the system more customizable. Letting users convert their quest prefabs to quest scripts that automatically inherits the core functionality, so the user can freely add their own additional functionality on top of the existing core
Asset development as fuel - "A learning experience"
Developing this way, splitting the production into sub systems that can function on their own and even be used by others is not something that should be taken lightly, but if you can build something lasting, something others can find value in using, then the final product will be all the better for it. Custom Quest started as a project we thought could be completed in a couple of months, it ended up taking 7.
In part this is because we realised that if we were going to release the system, we might as well do it right, that meant creating a system that was customizable and robust, a system that can be added to the users game and not the other way around, a system we could be proud of.
The experience of developing for other developers is quite different to developing a game. One that has made us much stronger as programmers and as a company, it forced us to think in new ways, in order to create a dynamic and customizable solution. Custom quest has evolved from an asset we could use in Quest Accepted, into a tool others can use to create a unique game experience. All in all, the experience has been a good one and Random Dragon is stronger for it, I would, however, recommend thinking about your plugin and extra time before you start developing.

Sources:
www.pcgamesn.com -"We know you aren't stupid" - a quest design master class from CD Projekt RED
http://www.pcgamesn.com/the-witcher-3-wild-hunt/the-witcher-quest-design-cd-projekt-masterclass
http://www.gamasutra.com/ - Game Design Essentials: 20 RPGs - http://www.gamasutra.com/view/feature/4066/game_design_essentials_20_rpgs.php?print=1
Extra credits - Quest Design I - Why Many MMOs Rely on Repetitive Grind Quests https://www.youtube.com/watch?v=otAkP5VjIv8&t=219s
Extra credits - Quest Design II - How to Create Interesting MMO and RPG Quests https://www.youtube.com/watch?v=ur6GQp5mCYs
Center for Games and Playable Media - Situating Quests: Design Patterns for Quest and Level Design in Role-Playing Games - http://sokath.com/main/files/1/smith-icids11.pdf
Center for Games and Playable Media - RPG Design patterns https://rpgpatterns.soe.ucsc.edu/doku.php?id=patterns:questindex

Special thanks to Allan Schnoor, Kenneth Lodahl and Kristian Wulff for feedback, constructive criticism and background materials.

• When we last saw the sunshine? ... It seems that ten years ago ...
We both wanted to live under the warm sun, so we want to go ...
Having spent ten years in bins, people start an uprising. Rebellion for a place under the sun, which is now occupied by scary creatures .. When people are cornered, patience may be over. And it was over. Without hope of salvation without faith in victory, people are going to fight for own world
You - one of them, clean your city from hundreds of monsters and give of humanity hope of salvation on this night, full of hardcore and aggression!

• By Ahrakeen
Hello we are looking for a second coder to assit with our strategic roleplaying game. it's a unity based engine with the ORK framework.
we hope to have someone help complete our prologue so we can turn this into a complete game.

we are aiming for something close to children of zodiac or fire emblem. but heavily focused on magic and urban legends.
main issue we are facing is getting the combat aspects in place and tie it together with a visual novel package we aim to fit with this
• By dobbey
Who are you?
We call ourselves Dobbey. Our team currently consists of two people.
We are both early 20's and come from Germany. At the moment this is our hobby.
What's the name of the game and what is it about?
The game is called Insane and it is a 2D adventure puzzle game with horror elements.
Insane is about a scientist who has been doing human experiments for years.
His most successful experiment is number 73, which seems to be mentally labile.
This experiment manages to flee one day but can't distinguish between reality and imagination.
In this game you will find a creepy atmosphere with difficult and varied puzzles.
What inspired you?
The style of the game is inspired by Limbo. But we were also inspired by Jump 'n' Run games and movies.
Of course, we have also our own elements like an inventory system, butterfly effect, the "INSANE" effect, using a QR-Code..
Which program do you use to develop the game?
We are programming it with Unity. In our opinion, it is the best program for indie games.
And of course we are working with Photoshop to create the graphics.
What platform will Insane be available on?
For PC.
How can I support you?
Instagram:   http://bit.ly/2qwU2bl
Website:       http://bit.ly/2s8buqU

Here you can see some of our screenshots.

(You can find the animation on Twitter/Instagram.)

(You can find the animation on YouTube.)

What do you think about it?

Yo can see more screenshots or videos on Twitter, Instagram or YouTube.

• Hello, my name is Thomas and I am currently starting up a project.
The project is going to be a very hardcore, and tactical FPS that is similar to Escape from Tarkov. It will be made within Unity, and will be programmed in C#. Currently, I have a Unity project started, an organized Discord setup, and as well as a very organized Google Drive. The Google Drive has art references, and plenty of folders for organization. Lastly, the payment for this project will be solely rev-share as I have no money.
I am looking for anyone who can contribute: 2D artists, 3D artists, composers, programmers, etc.
If you would like to help out and be of use, please email me at: thomasmunson2277@gmail.com