Pergunta

Atualmente, estou usando o seguinte modelo de função para suprimir avisos variáveis ??não utilizadas:

template<typename T>
void
unused(T const &) {
  /* Do nothing. */
}

No entanto, quando portar para cygwin do Linux, agora estou recebendo erros do compilador no g ++ 3.4.4 (Em linux Estou 3.4.6, talvez por isso esta é uma correção de bug?):

Write.cpp: In member function `void* Write::initReadWrite()':
Write.cpp:516: error: invalid initialization of reference of type 'const volatile bool&' from expression of type 'volatile bool'
../../src/common/Assert.h:27: error: in passing argument 1 of `void unused(const T&) [with T = volatile bool]'
make[1]: *** [ARCH.cygwin/release/Write.o] Error 1

O argumento para não utilizado é uma variável de membro declarado como:

  volatile bool readWriteActivated;

Isso é um erro de compilação ou um erro no meu código?

Aqui é o caso de teste mínimo:

template<typename T>
void unused(T const &) { }

int main() {
  volatile bool x = false;
  unused(!x); // type of "!x" is bool
}
Foi útil?

Solução 3

É um bug do compilador e não há arounds trabalho conhecidos:

http://gcc.gnu.org/bugzilla/show_bug.cgi ? id = 42655

Ele é fixado em v4.4.

Outras dicas

A maneira real de indicar que você realmente não usar um parâmetro não está dando-lhe um nome:

int f(int a, float) {
     return a*2;
}

irá compilar todos os lugares com todos os avisos ligado, sem aviso sobre o flutuador não utilizado. Mesmo se o argumento tem um nome no protótipo (por exemplo int f(int a, float f);), ele ainda não vai reclamar.

Eu não estou 100% certo de que este é portátil, mas esta é a linguagem que eu normalmente usado para suprimir advertências sobre variáveis ??não utilizadas. O contexto aqui é um manipulador de sinal que só é usado para SIGINT captura e SIGTERM, por isso, se a função é sempre chamado Eu sei que é tempo para que o programa de saída.

volatile bool app_killed = false;
int signal_handler(int signum)
{
    (void)signum; // this suppresses the warnings
    app_killed = true;
}

I tendem a não gostar atravancando a lista de parâmetros com __attribute__((unused)), já que o elenco-se vazio truque funciona sem recorrer a macros para Visual C ++.

No GCC, você pode definir uma macro da seguinte forma:

#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif 

Qualquer parâmetros marcados com esta macro irá suprimir os emite CCG aviso não utilizados (e renomeia o parâmetro com um prefixo de UNUSED_). Para o Visual Studio, você pode suprimir avisos com uma directiva #pragma.

A resposta proposta por haavee (alterada pela ur) é o que eu normalmente usaria:

int f(int a, float /*epsilon*/) {
     return a*2;
}

O verdadeiro problema acontece quando o argumento é às vezes , mas nem sempre utilizada no método, por exemplo:.

int f(int a, float epsilon) {
#ifdef LOGGING_ENABLED
     LOG("f: a = %d, epsilon = %f\n", a, epsilon);
#endif
     return a*2;
}

Agora, eu não posso comentar o nome do parâmetro epsilon, porque isso vai quebrar meu construir logging (Eu não quero inserir outro #ifdef na lista de argumentos, porque isso torna o código muito mais difícil de ler).

Então eu acho que a melhor solução seria usar a sugestão de Tom:

int f(int a, float epsilon) {
(void) epsilon;    // suppress compiler warning for possibly unused arg
#ifdef LOGGING_ENABLED
     LOG("f: a = %d, epsilon = %f\n", a, epsilon);
#endif
     return a*2;
}

A minha única preocupação seria a de que alguns compiladores pode alertar sobre o "epsilon (void);" declaração, por exemplo, "A declaração não tem efeito" aviso ou algo assim - eu acho que eu vou ter que teste em todos os compiladores que eu sou propensos a usar ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top