Необходимость новых строк в C: последовательности символов, распознаваемые как таковые и имитирующие разрывы строк - PullRequest
1 голос
/ 25 апреля 2010

Есть ли последовательность символов, распознаваемая как новая строка, которая определяется стандартом C и / или распознается GCC? Как можно смоделировать символы новой строки после директив препроцессора, чтобы они и код на С разделяли одну строку? Как насчет использования орграфов или триграфов?

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

http://en.wikipedia.org/wiki/C_preprocessor#Multiple_lines говорит, что они заканчиваются на первой строке, которая не заканчивается обратной косой чертой. Как мы можем сделать так, чтобы они заканчивались линией?

Ответы [ 4 ]

1 голос
/ 25 апреля 2010

В зависимости от того, что вы пытаетесь выполнить, директива #line может помочь.

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

или более обычно

#line __LINE__ - 1
1 голос
/ 25 апреля 2010

Это невозможно, по крайней мере, в GCC. Из документации GCC :

За исключением раскрытия предопределенных макросов, все эти операции запускаются с помощью директив предварительной обработки. Директивы предварительной обработки - это строки в вашей программе, которые начинаются с `# '.

Таким образом, препроцессор должен прочитать конец строки после директивы include, чтобы это работало:

В разных системах используются разные условные обозначения для обозначения конца строки. GCC принимает контрольные последовательности ASCII LF, CR LF и CR в качестве маркеров конца строки.

Таким образом, вы не можете использовать последовательность новой строки с другой платформы, по крайней мере, в GCC.

Для новой строки: нет орграфа :

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

Также нет триграфа :

Trigraph:       ??(  ??)  ??<  ??>  ??=  ??/  ??'  ??!  ??-
Replacement:      [    ]    {    }    #    \    ^    |    ~
1 голос
/ 25 апреля 2010

К сожалению, это невозможно с макросами.

Однако вы можете создать файл .h, чтобы иметь тот же эффект; например, иметь myheader.h:

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

А потом в других ваших файлах:

#include "myheader.h"
0 голосов
/ 25 апреля 2010

В зависимости от того, кого вы пытаетесь обмануть, персонаж с вертикальной табуляцией (control-K) может сработать.

Или нет. Я снова посмотрел на стандартные и, по-видимому, вертикальные вкладки не считаются переводами строки.

И сегодня в сообщении comp.std.c ++ говорится, что вертикальная табуляция в строке предварительной обработки просто недопустима (§16 / 2).

...