Portál AbcLinuxu, 14. května 2025 01:04
#include <jméno>
, tak nemůžu použít znak >
v názvu souboru, ale <
použít můžu. Pak že ve variantě #include "jméno"
nemůžu použít znak "
. A taky, že to neinterpretuje backslash sekvence jiné než newline-escape, (né \n
, ale \<opravdový newline>
). Já tu mám soubor, co má newline v názvu souboru, a nevím, jak ho includovat. Pan učitel tvrdí, že to jde a je to domácí úkol, ale už jsem zkusil snad všechno, ale nedaří se.
\r\n
//1 - bez newline #include "homework.h" //2 - newline v řetězci, hlásí, že chybí ukončovací ", // druhý řádek to nebere jako součást include directivy #include "homework .h" //3 - toto akorát udělá escape skutečného newline znaku v rámci // preprocesoru, výsledek je "homework.h" #include "homework\ .h" //4 - \n není bráno jako escape sekvence, ale jako součást názvu #include "homework\n.h" //5 - opět \n je součástí názvu #define HOMEWORK "homework\n.h" #include HOMEWORK
Jestli učitel zadává takové domácí úkoly, tak je to pitomec.
Použití \ v názvu souboru pro #include je implementačně závislé, tudíž to, že escape sekvence pomocí \ nefungují je zcela správně. Záviset na takovém chování může jedině blázen. Mimochodem, tohle omezení nejde obejít ani pomocí trigraphu ??/, protože trigraphy se interpretují jako první.
Standard sice povoluje použití jakéhokoli znaku z basic source character set, takže nejspíš i newline (až na tebou jmenované výjimky), ale okamžitě narazíš na problém, jak rozlišit normální odřádkování a znak nového řádku ve jménu souboru. To by se teoreticky dalo obejít tím, že bys ve zdrojácích odřádkovával pomocí DOS newlines (CR LF) a unixové odřádkování (LF) bys použil jen ve jménu souboru (nebo naopak). Ale zpracování je zase závislé na implementaci – clang a gcc obojí zpracuje jako normální odřádkování. Ani u jednoho se mi nepodařilo najít nějaký přepínač, kterým by se dal způsob odřádkování vynutit.
Jestli učitel zadává takové domácí úkoly, tak je to pitomec.Dobrý kus kreténa to musí být.
$ touch main.c
$ echo "int foo();" > "foo
> bar.h"
$ cpp -include "foo
bar.h" main.c
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "./foo
bar.h" 1
int foo();
# 1 "<command-line>" 2
# 1 "main.c"
$ cpp --version
cpp (GCC) 4.8.3
...
?
Btw, aká je to škola?
6.4.7 Header names Syntax header-name: < h-char-sequence > " q-char-sequence " h-char-sequence: h-char h-char-sequence h-char h-char: any member of the source character set except the new-line character and > q-char-sequence: q-char q-char-sequence q-char q-char: any member of the source character set except the new-line character and "Máte vôbec s učiteľom ujasnené, s akým kompilátorom to má chodiť?
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.