Eu tenho uma consulta sqlite bastante longa:
Como posso quebrá-lo em várias linhas para facilitar a leitura? Se eu fizer o seguinte:
Estou recebendo um erro.
Existe uma maneira de escrever consultas em várias linhas?
Há duas maneiras de dividir seqüências de caracteres em várias linhas:
Usando \
Todas as linhas em C podem ser divididas em várias linhas usando \.
C simples:
Existe uma abordagem melhor que funciona apenas para strings.
A segunda abordagem é melhor, porque não há muito espaço em branco incluído. Para uma consulta SQL, no entanto, ambos são possíveis.
NOTA: Com um #define, você precisa adicionar um '\' extra para concatenar as duas strings:
Ambos são os mesmos que em e C e C ++. A última solução é preferida porque a primeira incorpora muito espaço em branco inútil no programa que também será transmitido ao servidor DB.
Você está faltando um @ no início da linha 2 no melhor exemplo de Objective-C.
Você tem um link para uma especificação que documenta a opcionalidade do segundo @?
@HeathBorders: Não está aqui, mas eu procurei quando escrevi a resposta.
Outra vantagem da melhor abordagem é que você pode colocar // comentários após cada linha.
Há um truque que você pode fazer com o pré-processador.
Ele tem o potencial de reduzir o espaço em branco e pode ser confuso para as pessoas que leem o código.
Mas, tem o lado positivo de que você não precisa escapar de caracteres de aspas dentro dele.
o pré-processador transforma isso em:
Eu usei esse truque quando estava escrevendo alguns testes de unidade que tinham grandes seqüências literais contendo JSON. Isso significava que eu não precisava escapar de todos os caracteres de citação ".
— Nicholas Daley
Perfeito! Agora eu só preciso dar uma mais algumas centenas de upvotes, e obtê-lo onde ele pertence ...
Eu estava reagindo da mesma maneira, mas isso não é sem problemas. Eu apenas tentei fazer um heredoc dessa maneira com um caractere Unicode especial e recebi um erro sobre caracteres não ASCII não serem permitidos fora dos literais.
— philipkd
+1, mas para o registro, estou tendo problemas com o compilador (MSVC) ou o editor (QtCreator) não (re) compilando a expressão como deveria na alteração. É como se a mudança não fosse detectada ... Pressionar Rebuild ao invés de Build faz o truque.
Obrigado por esta pepita de galinha de informações. Faz exatamente o que eu precisava fazer sem todo o lixo extra.
— FishGuy876 23/08/19
Infelizmente, isso não funciona se você tiver aspas literais na string. Bem, isso meio que funciona, pois gera um aviso. Mas minha base de código é -Werror ...
Você também pode acessar XCode -> Preferences, selecionar a guia Indentation e ativar a quebra automática de linha.
Dessa forma, você não precisará digitar nada extra e isso funcionará para as coisas que você já escreveu. :-)
Uma coisa irritante é ...
@YoYoYonnY Eu concordo, mas também aprecio isso. Parece-me que esse comentário não seria realmente possível como comentário, daí o uso do formato de resposta. Parece uma limitação de S / O, que você não pode escrever comentários particularmente ricos (pelo que sei).
Como estou com esse problema o tempo todo, criei uma pequena ferramenta para converter texto em uma string Objective-C de várias linhas de escape:
— Flaviu
ótima ferramenta! pergunta: por que você escapa '|'?
— Justadreamer
Bom ponto. Eu mudei para não mais escapar "|". Obrigado por me avisar.
Eu tive a mesma ideia. Gostaria de ter visto isso primeiro. Minha ferramenta é: nsstringify.nateflink.com
— Nate Flink
Obrigado, me salvou muito tempo!
— Djskinner
Tente usar o Clang Format (integra-se com seus editores favoritos): clang.llvm.org/docs/ClangFormat.html
Estendendo a ideia de cotação para o Objective-C:
#define NSStringMultiline(...) @#__VA_ARGS__deve funcionar também.
Para seqüências de caracteres mutáveis: #define NSStringMultiline(...) [[NSMutableString alloc] initWithCString:#__VA_ARGS__ encoding:NSUTF8StringEncoding]
— rimsky 21/03/2015
Para mim, a sequência resultante não possui novas linhas.
Novas linhas com escape são capturadas corretamente (o que não é tão conveniente ou agradável).
@rimsky, e acho que isso #define NSStringMultiline(...) [@#__VA_ARGS__ mutableCopy]também funciona para strings mutáveis.
Mais uma solução para a pilha, altere seu arquivo .m para .mm para que ele se torne Objective-C ++ e use literais brutos em C ++, assim:
Literais brutos ignoram tudo até a sequência de finalização, que no caso padrão é aspas entre parênteses.
Se a sequência de aspas entre parênteses precisar aparecer na sequência em algum lugar, você também poderá especificar facilmente um delimitador personalizado, como este:
Eu também constatou que o GCC acrescenta C ++ strings literais-primas como uma extensão da linguagem C: stackoverflow.com/questions/797318/...
O GCC adiciona literais de cadeia bruta multilinha em C ++ como uma extensão C
O C ++ 11 possui literais de cadeia bruta, conforme mencionado em: https://stackoverflow.com/a/44337236/895245
No entanto, o GCC também os adiciona como uma extensão C, basta usar em -std=gnu99vez de -std=c99. Por exemplo:
Isso pode ser usado, por exemplo, para inserir montagem em linha multilinha no código C: Como escrever código de montagem em linha multilinha no GCC C ++?
Agora basta recostar-se e aguardar que seja padronizado no C20XY.
O C ++ foi solicitado em: literal de cadeia de linhas multilinha do C ++
Testado no Ubuntu 16.04, GCC 6.4.0, binutils 2.26.1.
Uma alternativa é usar qualquer ferramenta para remover quebras de linha. Escreva sua string usando qualquer editor de texto, depois de terminar, cole o texto aqui e copie-o novamente no xcode.
— OUBERGHOUZ MOHAMED
Não é realmente uma solução a longo prazo. E se você precisar alterá-lo novamente mais tarde. Seja rápido, irritante, melhor usar as técnicas de várias linhas já mencionadas e formatá-lo diretamente no arquivo.