определить USE (x) (x) = (x) - PullRequest
       1

определить USE (x) (x) = (x)

6 голосов
/ 15 ноября 2010

В одном из файлов исходного кода C я нашел следующую строку (макрос):

#define USE(x) (x) = (x)

Используется так:

int method(Obj *context)
    {
    USE(context);
    return 1;
    }

После поиска в Google, янашел следующее описание:

// Макрос, чтобы избавиться от некоторых предупреждений компилятора

Не могли бы вы рассказать мне больше об этом макросе?

Спасибоза ваши ответы!

Ответы [ 4 ]

13 голосов
/ 15 ноября 2010

Некоторые компиляторы жалуются, когда переменные фактически никогда не используются ни для чего.например:

int main(int argc, char **argv) {
  return 0;
}

Дает:

Output from llvm C/C++/Fortran front-end (llvm-gcc)

/tmp/webcompile/_7618_1.c: In function 'main':
/tmp/webcompile/_7618_1.c:9: warning: unused parameter 'argc'
/tmp/webcompile/_7618_1.c:9: warning: unused parameter 'argv'

Странно, я могу просто избавиться от этих предупреждений, используя ваш макрос:

#define USE(x) (x) = (x)


int main(int argc, char **argv) {
  USE(argc); /* get rid of warnings */
  USE(argv); /* get rid of warnings */
  return 0;
}
8 голосов
/ 15 ноября 2010

Компиляторы выдают предупреждения, когда переменная определена / объявлена, но никогда не используется.К ним относятся аргументы функции.Некоторые стили кодирования требуют всегда называть аргументы функции, но некоторые из них могут не использоваться в функции.Они зарезервированы для будущего использования.В этих случаях вы можете USE(param) избежать предупреждения

5 голосов
/ 15 ноября 2010

С помощью gcc вы можете использовать __attribute__((unused)) для подавления предупреждения.

4 голосов
/ 15 ноября 2010

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

void func1(void)
{
    int unusedVariable = 0;
    /* do stuff without using unusedVariable */
} /* warning about not using unusedVariable */

void func2(void)
{
    int unusedVariable = 0;
    USE(unusedVariable);
    /* do stuff without using unusedVariable */
} /* no warning is issued */
...