2013-09-04 6 views
4

Мой компилятор поднимает предупреждение #381-D: extra ";" ignored в такой ситуации:Предупреждение: «экстра, игнорировали» с помощью C макросов с ARMCC

У меня есть-структуру, определенную, как следующий

struct example_s 
{ 
    u8_t foo; 
    SOME_MACRO(bar); 
}; 

Макрос SOME_MACRO(x) выполняет следующие действия:

#if defined(SYSTEM_A) 
    #define SOME_MACRO(x) u16_t x##something 
#else 
    #define SOME_MACRO(x) /* nothing */ 
#endif 

конечно, предупреждение является правильным, когда SYSTEM_A не определен. Просто потому, что у меня теперь есть ; внутри структуры. Но знает ли кто-нибудь способ избежать этого правильно? Я не хочу нарушать типичный стиль C, перемещая ; в макрос.

ответ

3

Вы можете добавить неназванный 0 ширины битовое вместо:

#if defined(SYSTEM_A) 
    #define SOME_MACRO(x) u16_t x##something 
#else 
    #define SOME_MACRO(x) unsigned :0 
#endif 
+0

Это работает отлично, используя ARMCC, thx – daniel

4

Один из способов, который немного ляп, но это, кажется, работает с GCC:

#if defined(SYSTEM_A) 
    #define SOME_MACRO(x) u16_t x##something 
#else 
    #define SOME_MACRO(x) int x[0] /* nothing */ 
#endif 

С помощью этого метода вы в конечном итоге с структуры, как это:

struct example_s 
{ 
    u8_t foo; 
    int bar[0]; 
}; 

, который отнесен к правильный размер (т. е. как размер bar не был определен вообще).

+1

Обратите внимание, что это не действует в ISO C (размер массива константа "... имеют значение больше нуля"). –

+0

@undur: thanks - Я не заметил, что вопрос был помечен как C и ошибочно принял C++ - но он, похоже, работает с gcc по крайней мере, когда скомпилирован как C или C++. Я оставлю его адвокатам языка и педантам, чтобы они проголосовали по своему усмотрению. ;-) –

+2

ARMCC вызывает ошибку: «Размер массива должен быть больше нуля» – daniel

3

вы также можете вставить пустой анонимную-структуру:

#if defined(SYSTEM_A) 
    #define SOME_MACRO(x) u16_t x##something 
#else 
    #define SOME_MACRO(x) struct {} 
#endif 
+3

+1. Но это не соответствует действительности в ISO C99. –

+1

ARMCC вызывает ошибку «Ожидаемая декларация». К сожалению, также используя инструкцию 'struct test {}' – daniel

 Смежные вопросы

  • Нет связанных вопросов^_^