Mogao bih ti sada pokazati stvari koje GCC dozvoljava preko svojih ekstenzija, koje uopće nisu normalne i neće se moći kompajlirati ni sa jednim kompajlerom osim GCC-a...
Ako u kodu moraš podržati nekoliko compilera, to na kraju u praksi izgleda otprilike ovako (primjeri su iz stvarnog koda, radi se Keil-ovom USB CDC stacku za jednu implementaciju ARM Cortex-M3):
#if defined ( __CC_ARM )
#pragma diag_suppress 111,1441
#endif
#if defined ( __GNUC__ )
#define __packed __attribute__((__packed__))
#endif
...i onda krene rokačina...
#if defined ( __IAR_SYSTEMS_ICC__ )
inline uint32_t USB_ReqGetStatus (void) {
#else
__inline uint32_t USB_ReqGetStatus (void) {
#endif
...nadalje za skoro svaku funkciju ide barem ovakav #if, jer uvijek jedan proizvođač mora biti različit. :)
Deklariranje "packed" strukture izgleda naročito zanimljivo ako tri ili više compilera u igri...
// Union functional descriptors with one slave interface
// (usbcdc11.pdf, 5.2.3.8)
#if defined ( __CC_ARM )
typedef __packed struct _CDC_UNION_1SLAVE_DESCRIPTOR{
#elif defined ( __GNUC__ )
typedef struct __packed _CDC_UNION_1SLAVE_DESCRIPTOR{
#elif defined ( __IAR_SYSTEMS_ICC__ )
#pragma pack(1)
typedef struct _CDC_UNION_1SLAVE_DESCRIPTOR {
#endif
CDC_UNION_DESCRIPTOR sUnion; // Union functional descriptor
uint8_t bSlaveInterfaces[1]; // Slave interface 0
} CDC_UNION_1SLAVE_DESCRIPTOR;
Svi compileri i linkeri s kojima sam do sada radio su pomalo nestandardni i nekompatibilni s bilo kojim drugim, jedino je pitanje gdje će te to dohvatiti, na uobičajenim "Hello world" stvarima, ili kod ovakvih gdje se radi nešto sa hardwareom.



