Определение констант в C

#c #c

#c #c

Вопрос:

Я долгое время работал с C , и сейчас я работаю над проектом на C.
Я нахожусь в процессе преобразования программы на C в C.

У меня возникли трудности с константами, используемыми в программе.
В коде C у нас есть константы, определенные как

 static const int X = 5   3;
static const int Y = (X   10) * 5
static const int Z = ((Y   8)   0xfff) amp; ~0xfff
  

В C эти определения выдают ошибку.
Когда я использую #defines вместо констант типа

 #define X (5 3);
#define Y (((X)   10) * 5)
#define Z ((((Y)   8)   0xfff) amp; ~0xfff)
  

компилятор C жалуется на определения «Y» и «Z».

Не мог бы кто-нибудь, пожалуйста, помочь мне найти решение для этого.

Комментарии:

1. Люди уже предложили решение, но я просто хочу указать причину, по которой вам нужно удалить точку с запятой. #define в c препроцессор выполняет текстовую подстановку перед компиляцией, поэтому представьте, что вы берете содержимое X и вставляете его в Y, и вы, вероятно, увидите, в чем проблема.

2. Некоторые люди также используют перечисления для объявления констант в C, например enum { N = 100 }; .

3. static является избыточным в примере C . const объекты, которые явно не объявлены extern , в любом случае имеют внутреннюю связь.

4. Да, это была точка с запятой. Какой я глупый. Спасибо всем.

Ответ №1:

Вам нужно убрать точку с запятой из строки #define X

 #define X (5 3)
#define Y (((X)   10) * 5)
#define Z ((((Y)   8)   0xfff) amp; ~0xfff)
  

Ответ №2:

#define X (5 3); неправильно, это должно быть #define X (5 3) (без ‘;’)
также имейте в виду разницу между использованием static const и #define: в static const значение фактически вычисляется, в #define это команда препроцессора, поэтому

 #define n very_heavy_calc()
...
n*n;
  

приведет к вычислению very_heavy_calc() дважды

Ответ №3:

Другой вариант — использовать перечисление:

 enum {
  X = 5   3,
  Y = (X   10) * 5,
  Z = ((Y   8)   0xfff) amp; ~0xfff
};