Как правильнее: #define Hello Msg[10] или #define Hello (Msg[10])

Рейтинг: 0Ответов: 1Опубликовано: 28.04.2011

Нужно использовать скобки в таких определениях для C или нет?

char **Msg; Размер массива известен. Использование для printf() или чего-то подобного.

Собственно идея использования - предоставить динамически изменяемый (в определенных рамках) массив сообщений. Т.е. в одном файле с текстами сообщений строка

10 HELLO в другом,
10 Здравствуй, друг! и т.п.

Если возможно, приведите примеры, когда такой подход не работает, или провоцирует ошибки.

Ошибка, когда вместо 10 набрали 11 и это не соответствует тому, что задумано в #define очевидна.

Ответы

▲ 2

Я считаю, что в данном случае лучше заделать констант. Можно как просто обычных констант, так и енумом (перечисление), а потом уже адресовать ими в качестве индекса элементы массива **Msg. Т.е.

const ID_HELLO_MSG=10;
const ID_BYE_MSG=11;
....
char **Msg;
....
// где-то в коде
printf("%s", Msg[ID_HELLO_MSG]);

Это существенно более переносимо и более ошибкоустойчиво, чем дефайн. А если используются приплюснутые С, то можно придумать еще более интересные реализации. Но лучше все-таки конкретизировать - что хочется получить на выходе.

Собственно вопрос о том, нужно использовать скобки в таких определениях для C или нет?

Собственно по вопросу: обязательно использовать скобки в макроопределениях.

#define add2(x) (x) + (x)
add2(x)*x; // на выходе имеем не (x+x)*x, как можно подумать,
//а x+x*x, что явно совсем другое
//поэтому корректнее - #define add2(x) ((x) + (x))