Pergunta

Eu tentei pesquisar a documentação ea internet tão bem como eu sou capaz, mas eu não tenho sido capaz de obter o compilador Xcode para emitir um aviso se o operador de atribuição é usado em uma instrução if.

Eu estou vindo RealBasic, onde eu tenho um extremamente forte hábito de escrever este tipo de comparação:

if x = 5 then ...

Em C, é claro, que atribui sintaxe x o valor de 5, em seguida, testa o resultado para ver se é diferente de zero, eo operador "correta" é:

if (x == 5) { ... }

Eu encontrei várias menções que o compilador deve ser capaz de avisar se houver cessão feita em um caso de comparação, mas eu não consigo encontrar como para ligá-lo no Xcode 3.1 / gcc. Eu encontrei a opção -pedantic, mas que não parecem gerar o aviso.

Uma vez que eu passei uma quantidade razoável de tempo duas vezes agora rastrear bugs que acabou por ser "=" em vez de "==", eu gostaria da ajuda de um aviso.

Eu sei que eu posso fazer isso em vez (que fará com que um erro do compilador):

if (5 = x) { ... }

... mas que exige mudança de hábitos de codificação enraizados também. Sem mencionar que parece desajeitada e para trás.

Obrigado!

Foi útil?

Solução 2

O link na resposta de ennuikiller levou a que eu precisava.

Aqui está um pouco mais de informações para qualquer pessoa que possa encontrar isso no futuro:

  • O aviso do compilador é "Missing chaves e parênteses", ou -Wparentheses.

  • O alerta está ligado, escolhendo Get Info para a corrente -alvo no Xcode.

  • Como eu finalmente descobri, o iPhone Simulator SDK faz não Mostrar esta opção de compilador.

  • Mudar o SDK para iPhone dispositivo apresentará o GCC 4.2 Advertências seção, que inclui "Faltando chaves e parênteses".

  • Depois de ligar essa opção no SDK de dispositivos iPhone, a mudança de volta para os programas que um Similator configuração construção "User-Defined" tem sido acrescentou: GCC_WARN_MISSING_PARENTHESES = "SIM".

  • Se uma atribuição é realmente desejado em uma instrução if, você pode dobrar os parênteses para evitar o aviso.

(duas vezes parênteses exemplo:)

if ((x = 5)) { ... }

O alerta funciona como um encanto, embora ele faz não gostar da Apple padrão:

if (self = [super init]) { ... }

Eu provavelmente vou deixar aqueles em que se encontra, embora se eu acabar com uma enorme quantidade deles em um projeto, eu vou quer dobrar o parêntese ou quebrar a atribuição em uma linha separada.

Obrigado!

Outras dicas

Você está procurando a opção -Wall eu acho.

int main(void) {

    int x = 5;
    if ( x=5) { 
    }
    return 0;
  }

$ g++ -pedantic x.cc 
$ g++ -Wall x.cc 
x.cc: In function ‘int main()’:
x.cc:7: warning: suggest parentheses around assignment used as truth value

Este ligação descreve como ativar as opções através do Xcode GUI

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