2010-04-25 2 views
1

Existe-t-il une séquence de caractères reconnue comme un retour à la ligne définie par la norme C et/ou reconnue par GCC? Comment peut-on simuler les newlines après que les directives du préprocesseur les aient et que le code C partage la même ligne? Que diriez-vous d'utiliser des digrammes ou des trigraphes?Nécessité de nouvelles lignes dans C: Séquences de caractères reconnues comme telles et simulant des sauts de ligne

#include <stdlib.h> [NEWLINE] int main() { exit(EXIT_SUCCESS); } 

http://en.wikipedia.org/wiki/C_preprocessor#Multiple_lines dit qu'ils se terminent à la première ligne qui ne se termine pas par une barre oblique inverse. Comment pouvons-nous les faire se terminer dans une ligne?

+2

Pourquoi voulez-vous faire? –

+0

Dupe http://stackoverflow.com/questions/98944/how-to-generate-a-newline-in-a-cpp-macro –

+2

Vous ne pouvez pas générer un '# include' avec des macros. – kennytm

Répondre

1

Ceci n'est pas possible, du moins pas sur GCC. À l'exception de l'expansion de macros prédéfinies, toutes ces opérations sont déclenchées par des directives de prétraitement à l'exception de l'expansion des macros prédéfinies. Les directives de prétraitement sont des lignes de votre programme commençant par «#».

Ainsi, le préprocesseur doit lire an end-of-line après la directive include pour que cela fonctionne:

Les différents systèmes utilisent des conventions différentes pour indiquer la fin d'une ligne. GCC accepte les séquences de contrôle ASCII LF, CR LF et CR comme marqueurs de fin de ligne. Par conséquent, vous ne pouvez pas utiliser une séquence de nouvelle ligne à partir d'une plate-forme différente, du moins pas sur GCC.

Il est no digraph pour la nouvelle ligne:

Digraph:  <% %> <: :> %: %:%: 
Punctuator:  { } [ ] # ## 

n'est là a trigraph:

Trigraph:  ??( ??) ??< ??> ??= ??/ ??' ??! ??- 
Replacement:  [ ] { } # \ ^ | ~ 
1

Malheureusement, cela n'est pas possible avec les macros.

Vous pouvez cependant créer un fichier .h pour avoir le même effet; par exemple, ont un myheader.h:

#include <stdlib.h> 
int main() { exit(EXIT_SUCCESS); } 

Et puis dans vos autres fichiers:

#include "myheader.h" 
+3

Il est malheureux qu'il y ait un cas d'utilisation qui devient plus difficile à cause de cela. Et je ne compte pas le code-golf. – dmckee

0

Selon que vous essayez de tromper, un vertical-tab character (contrôle-K) pourrait faire l'affaire.

Ou peut-être pas. J'ai encore regardé le standard et les onglets apparemment verticaux ne comptent pas comme des retours à la ligne.

Et un post comp.std.C++ me dit aujourd'hui que l'onglet vertical dans une ligne de prétraitement est tout simplement illégal (§16/2).

1

Selon ce que vous essayez d'accomplir, la directive #line pourrait faire l'affaire.

#include <stdlib.h> 
#line 1 
int main() { exit(EXIT_SUCCESS); } /* this is on line 1 */ 

ou plus généralement

#line __LINE__ - 1 
Questions connexes