MACROS - Как реализовать деление, а затем округлить - PullRequest
2 голосов
/ 28 декабря 2010

Как правильно выполнить деление и округление до меньшего числа для макроса?

Я пытаюсь сделать это:

#define TOTAL_NUM_FFTS  (int) NO_SAMPLES / FFT_SIZE

, но я получаю предупреждение онеоправданное переопределение этого макроса и компилятор переводит строку как: #define TOTAL_NUM_FFTS(int) NO_SAMPLES / FFT_SIZE без пробела между TOTAL_NUM_FFTS и (int).

Спасибо за вашу помощь!

Ответы [ 2 ]

11 голосов
/ 28 декабря 2010
#define TOTAL_NUM_FFTS  ((int) (NO_SAMPLES) / (FFT_SIZE))

Препроцессор считает (int) параметром макроса.

При определении макросов используйте как можно больше скобок. Например, подумайте, что произойдет, если кто-то определит FFT_SIZE как 2 + 3. Вместо того, чтобы делить на 5, вы делите на 2, а затем добавляете 3.

1 голос
/ 28 декабря 2010

Несколько вещей для проверки:

  • всегда правильно ставьте в скобки ваши макросы (и аргументы макроса), как Илья упомянул
  • убедитесь, что в другом месте нет дублирующего (или почти дублирующего) определения макроса. В сообщении об ошибке должно быть указано, где именно, но если это не так, поможет grep или аналогичный (возможно, есть более старая версия вашего заголовка, скрывающая в каком-то другом каталоге путь включения?).
  • убедитесь, что ваш заголовочный файл защищен от многократного включения с помощью include guard . Я не думаю, что это то, что происходит с вами, поскольку идентичное переопределение макросов должно приниматься компилятором C или C ++, но вы все равно должны убедиться, что ваш заголовок имеет это.
...