Является ли ключевое слово __extension__ переносимым среди всех компиляторов? - PullRequest
1 голос
/ 10 ноября 2019

Является ли ключевое слово __extension__ переносимым среди всех компиляторов? Я изучил это в руководстве по gcc, но они не упомянули, является ли это ключевое слово переносимым. Если кто-то знает, я буду благодарен за вашу помощь.

1 Ответ

1 голос
/ 10 ноября 2019
нет

нет. Все, что не подпадает под стандарт C, не является переносимым. И именно поэтому нам нужно писать такой ужасный код, если мы хотим (или должны) использовать специфические для компилятора прагмы или атрибуты расширений.

#if  defined ( __GNUC__ )
#ifndef __weak
#define __weak   __attribute__((weak))
#endif /* __weak */
#ifndef __packed
#define __packed __attribute__((__packed__))
#endif /* __packed */
#endif /* __GNUC__ */


/* In HS mode and when the DMA is used, all variables and data structures dealing
   with the DMA during the transaction process should be 4-bytes aligned */

#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */
#ifndef __ALIGN_END
#define __ALIGN_END    __attribute__ ((aligned (4U)))
#endif /* __ALIGN_END */
#ifndef __ALIGN_BEGIN
#define __ALIGN_BEGIN
#endif /* __ALIGN_BEGIN */
#else
#ifndef __ALIGN_END
#define __ALIGN_END
#endif /* __ALIGN_END */
#ifndef __ALIGN_BEGIN
#if defined   (__CC_ARM)      /* ARM Compiler */
#define __ALIGN_BEGIN    __align(4U)
#elif defined (__ICCARM__)    /* IAR Compiler */
#define __ALIGN_BEGIN
#endif /* __CC_ARM */
#endif /* __ALIGN_BEGIN */
#endif /* __GNUC__ */
...