Bir keresinde ile geldi bu biz hassaslaştırmalarına:
perl -0777 -pe '
BEGIN{
$bs=qr{(?:\\|\?\?/)};
$lc=qr{(?:$bs\n|$bs\r\n?)}
}
s{
/$lc*\*.*?\*$lc*/
| /$lc*/(?:$lc|[^\r\n])*
| (
"(?:$bs$lc*.|.)*?"
| '\''$lc*(?:$bs$lc*(?:\?\?.|.))?(?:\?\?.|.)*?'\''
| \?\?'\''
| .[^'\''"/?]*
)
}{$1 eq "" ? " " : "$1"}exsg'
birkaç köşe davasını ele almak için.
Eğer varsa o Not kaldırmak bir yorum, kod anlam değiştirebilir ( 1-/* comment */-1
gibi ayrıştırılır 1 - -1
iken 1--1
(Yorumunuzu kaldırıldı eğer elde ederim), hata verebilir olacaktır). Yorumu tamamen kaldırmak yerine boşluk karakteriyle (burada yaptığımız gibi) değiştirmek daha iyidir.
Yukarıdakiler, örneğin birkaç köşe vakası eklemeye çalışan bu geçerli ANSI C kodunda düzgün çalışmalıdır:
#include <stdio.h>
int main ()
{
printf ("% d% s% c% c% c% c% c% s% s% d \ n",
1 - / * yorum * / - 1,
/ \
* yorum Yap */
"/ * yorum değil * /",
/ * çok satırlı
yorum Yap */
'"' /* yorum Yap */ , '"',
'\'','"'/* yorum Yap */,
'\
\
"', /* yorum Yap */
"\\
"/ * yorum değil * /",
"?? /" / * yorum değil * / ",
'??' '+' '' / * "yorum" * /);
dönüş 0;
}
Bu çıktıyı verir:
#include <stdio.h>
int main ()
{
printf ("% d% s% c% c% c% c% c% s% s% d \ n",
1- -1,
"/ * yorum değil * /",
'"', '"',
'\' ',' "',
'\
\
"',
"\\
"/ * yorum değil * /",
"?? /" / * yorum değil * / ",
'??' '+' "');
dönüş 0;
}
Her ikisi de derlendiğinde ve çalıştırıldığında aynı çıktıyı yazdırır.
gcc -ansi -E
Ön işlemcinin üzerinde ne yapacağını görmek için çıktı ile karşılaştırabilirsiniz . Bu kod, ancak aynı zamanda geçerli C99 veya C11 kodudur gcc
üç karakterli varsayılan olarak destekleyen devre dışı bırakır böylece olmaz ile iş gcc
sizin gibi standart belirtmek sürece gcc -std=c99
veya gcc -std=c11
veya ekleme -trigraphs
) seçeneği.
Ayrıca bu C99 / C11 (ANSI / C90 olmayan) kod üzerinde çalışır:
// yorum Yap
/ \
/ yorum Yap
// çok satırlı \
yorum Yap
"// yorum değil"
( gcc -E
/ gcc -std=c99 -E
/ ile karşılaştır gcc -std=c11 -E
)
ANSI C // form
yorumu desteklemedi . //
ANSI C'de başka şekilde geçerli olmadığından orada görünmez. Bir yapmacık durum nereye //
(belirtildiği gibi gerçekten ANSI C görünebilir orada ve tartışma ilginç kalanını bulabilirsiniz) ne zaman olduğu stringify operatör kullanılıyor.
Bu geçerli bir ANSI C kodudur:
#define s(x) #x
s(//not a comment)
Ve 2004'teki tartışma sırasında gcc -ansi -E
bunu gerçekten genişletti "//not a comment"
. Ancak bugün, gcc-5.4
üzerinde bir hata döndürür, bu yüzden bu tür bir yapı kullanarak C kodu bir sürü bulacağımızdan şüpheliyim.
GNU sed
eşdeğeri şöyle bir şey olabilir:
lc='([\\%]\n|[\\%]\r\n?)'
sed -zE "
s/_/_u/g;s/!/_b/g;s/</_l/g;s/>/_r/g;s/:/_c/g;s/;/_s/g;s/@/_a/g;s/%/_p/g;
s@\?\?/@%@g;s@/$lc*\*@:&@g;s@\*$lc*/@;&@g
s:/$lc*/:@&:g;s/\?\?'/!/g
s#:/$lc*\*[^;]*;\*$lc*/|@/$lc*/$lc*|(\"([\\\\%]$lc*.|[^\\\\%\"])*\"|'$lc*([\\\\%]$lc*.)?[^\\\\%']*'|[^'\"@;:]+)#<\5>#g
s/<>/ /g;s/!/??'/g;s@%@??/@g;s/[<>@:;]//g
s/_p/%/g;s/_a/@/g;s/_s/;/g;s/_c/:/g;s/_r/>/g;s/_l/</g;s/_b/!/g;s/_u/_/g"
GNU'nuz sed
desteklenemeyecek kadar eskiyse -E
veya -z
ilk satırı şu şekilde değiştirebilirsiniz:
sed -r ":1;\$!{N;b1}