Pergunta

eu quero verificar hts em se vários hora, eu uso o #define para esse anúncio eu quiser usá-lo, mas ele não funciona

#define CHECK_CONDITION(QString condition, start, curr) if(condition == "" ) return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())

e eu usá-lo assim :

if(CHECK_CONDITION(table.commonIn().toStdString(), start, start-idx);) {
   findFalse = true;
}

como posso usar essa definição no meu código/ obrigado antecipadamente

Foi útil?

Solução

Você pode usar essa macro modificada:

#define CHECK_CONDITION(condition, start, curr) \
    if(condition == "" || (condition == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())

O erro que fizeram no macro:

  • Especificando QString para a condição

  • Retornando desde que não vai ter a lógica de "valor de retorno de macro", mas, na verdade, retornam no exterior função.Isso é porque ele tem que ir através do pré-processamento a etapa.

  • Você não precisa de ramos distintos dentro da macro como uma simples lógica OU ("||") pode fazê-lo.

  • Você usou a tabela comum em cadeia getter dentro da macro, mesmo que você já passou a variável de condição.

  • Gostaria de usar a barra de volta para torná-lo dividido em partes para melhor legibilidade.

e, em seguida, você pode manter o resto do seu código como este:

if(CHECK_CONDITION(table.commonIn(), start, (start-idx))) {
   findFalse = true;
}

Os erros aqui você fez:

  • Você tinha uma escusado será ponto e vírgula dentro de a condição se que é inválido sintaxe de C++.

  • Você pode entrar em problemas em geral (não aqui) com o que não colocar a subtração para o suporte.

  • Seria limpo, se você pode fazer de duas variáveis separadas para a cadeia e o atual número inteiro antes de o CHECK_CONDITION chamada de macro, como demonstrado abaixo.

  • Você está passando std::string, ao invés de incluir QString.

Mas seria ainda mais agradável se você poderia simplesmente a segunda parte, como este:

QString myString = table.commonIn();
int curr = start - idx;

if(CHECK_CONDITION(myString, start, curr)) {
   findFalse = true;
}

Isenção de responsabilidade:Eu tenho tentado fazer a sua macro e seu chamador de trabalho, mas, em geral, tenta evitar macros quando possível.

Há casos em que eles fazem sentido, mas existem alternativas como o modelo (que não é aplicável aqui) ou funções de linha e métodos (não sei se aplicável aqui).Dependendo do seu caso de uso, você pode pegar o que você preferir, mas você pode chegar ao ponto de esta resposta como fazer com que a macro de trabalho para o caso de uso.

Outras dicas

Pré-processador não tem noções de tipos, para você quando você declara uma #define com tipos, você não precisa especificar o tipo de parâmetro:

#define CHECK_CONDITION(condition, start, curr) { if(condition == "" ) return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())}

Além disso, uma #define é expandida onde você usá-lo (o pré-processador substitui CHECK_CONDITION com esse bloco de código), de modo que o seu código não irá compilar porque de pelo menos um motivo:você vai ser um aninhamento if dentro de um if condição, o que é um erro de sintaxe.

Use um (talvez inline) função, em vez disso:

inline
bool check_condition(QString condition, int start, int curr) {
    if(condition == "" ) return true;
    return (
        table.commonIn() == "team_id"?
            list()[start]->team() == list()[curr]->team():
            list()[start]->team() == list()[curr]->team()
    )
}

Isso também torna explícito um possível erro de sintaxe aqui:Eu não sei o que você quis dizer com as duas últimas linhas, então eu deixei que intocada...

Meu 2cents:você deve ver o pré-processador C++ como um último recurso:você tem modelos, const variáveis e funções inline.

A principal razão pela qual ele foi deixado em C++ (em vez de usar um include palavras-chave sozinho ou como) é manter a compatibilidade com versões anteriores de C.Nunca utilize o pré-processamento, a menos que qualquer outra solução é bastante mais complexo.

Um #define em C/C++ é uma definição de macro que é um textuais simples substituição.Esta definição é mais como uma função e está a tentar atribuir um tipo de um dos parâmetros.Isso não é legal sintaxe e, portanto, a QString parte precisa ser removido

No geral, entretanto, este código não é ideal para uma macro.Os argumentos start e curr ambos são usados várias vezes na expansão.Isso significa que, se de um lado, efetuar a expressão é passado para a macro será executada potencialmente muitas vezes.Uma função que seria muito mais apropriado aqui

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