LINUX.ORG.RU

Как корректно избежать «unused variables» в C/C++? (sorry, попытка N2, без кривого форматирования)


0

0

Я использую gcc (3.4.5). У меня есть функции вида:

void func(int param)
{
#ifdef FUNC_SUPPORT
/* Do something using 'param' */
#endif
}

Если FUNC_SUPPORT не определен, то func() превращается просто в
заглушку. Однако, в этом случае при компиляции я получаю "unused
variable" warning. Я понимаю, что этого можно избежать, играя с
опциями компилятора, однако в этом случае я пропущу действительный
мусор в исходниках. Мне хотелось бы узнать, есть ли вменяемые и
"общепринятые" что-ли методы сделать переменную used? :-) Следующая
конструкция выглядит омерзительно:

void func(int param)
{
#ifdef FUNC_SUPPORT
/* Do something using 'param' */
#else
param=param; /* Suppress warning */
#endif
}

однако выполняет свою работу. Так вот, есть ли нормальный выход из
ситуации?

anonymous

// ============================================================================
// Compiler Silencing macros
//
// Some compilers complain about parameters that are not used.  This macro
// should keep them quiet.
// ============================================================================

#if defined (ghs) || defined (__GNUC__) || defined (__hpux) || defined (__sgi) || defined (__DECCXX) || define
d (__KCC) || defined (__rational__) || defined (__USLC__) || defined (ACE_RM544) || defined (__DCC__) || defin
ed (__PGI) || defined (__TANDEM)
// Some compilers complain about "statement with no effect" with (a).
// This eliminates the warnings, and no code is generated for the null
// conditional statement.  @note that may only be true if -O is enabled,
// such as with GreenHills (ghs) 1.8.8.
# define ACE_UNUSED_ARG(a) do {/* null */} while (&a == 0)
#elif defined (__DMC__)
  #define ACE_UNUSED_ID(identifier)
  template <class T>
  inline void ACE_UNUSED_ARG(const T& ACE_UNUSED_ID(t)) { }
#else /* ghs || __GNUC__ || ..... */
# define ACE_UNUSED_ARG(a) (a)
#endif /* ghs || __GNUC__ || ..... */

#if defined (__sgi) || defined (ghs) || defined (__DECCXX) || defined(__BORLANDC__) || defined (__KCC) || defi
ned (ACE_RM544) || defined (__USLC__) || defined (__DCC__) || defined (__PGI) || defined (__TANDEM) || defined
 (__HP_aCC)
# define ACE_NOTREACHED(a)
#else  /* __sgi || ghs || ..... */
# define ACE_NOTREACHED(a) a
#endif /* __sgi || ghs || ..... */

// wbr

klalafuda ★☆☆
()

можно например так

cpp file:
#ifdef FUNC_SUPPORT
void _func(int param)
{

/* Do something using 'param' */
}
#endif

h file:
#ifdef FUNC_SUPPORT
# define func(p) _func(p)
#else
# define func(p)
#endif

fghj ★★★★★
()
Ответ на: комментарий от fghj

--- test.c ---
#include <stdio.h>

#ifdef FOO
int foo(int arg);
#else
#define foo(arg)
#endif

int
main()
{
    printf("foo=%d\n", foo(10));

    return 0;
}
--- test.c ---

$ cc -o foo test.c
test.c: In function `main':
test.c:13: syntax error before ')' token

// wbr

klalafuda ★☆☆
()

Если gcc - твой единственный компилятор то нет проблем.

Если надо убрать warning о неиспользуемом формальном параметре
или локальной переменной - используй атрибут unused, например.

void func(int param __attribute__ ((unused)))
{
int var __attribute__ ((unused));
}

HTH

Onanim
()
Ответ на: комментарий от klalafuda

> test.c:13: syntax error before ')' token

> // wbr

> klalafuda * (*) (29.03.2006 11:33:26)

Ну, дык, не здесь нужно что-то типа

#define foo(arg) 0

вы ведь int хотите, а не void?

k_andy ★★★
()

$ cat /usr/lib/qt/include/qglobal.h | grep -B 3 UNUSED

anonymous
()

void func(int param)
{
#ifdef FUNC_SUPPORT
/* Do something using 'param' */
#else
 (void)param;
#endif
}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.