definir função com #define no cpp?
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
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