アフィリエイト広告を利用しています

広告

posted by fanblog

2017年03月07日

C言語の行コメント内にバックスラッシュ(\)を入れると次の行がコメントアウトされることがある

S9fESを一通りやり終わったのですが完成したプログラムがバグってました。原因が行コメントに入っていた\(バックスラッシュ)で予想外だったうえに解決に時間がかかったのでメモして起きます。

s9fes_bug.png


//を使用した行コメントに\を入れると発生するバグ


S9fES完成後にいろいろ動かしていたのですが
s9fes> (newline)
を実行すると改行されず、
p
とだけ出力されるバグに遭遇しました。他の文字もランダムにまったく別な文字に置き換わってしまいます。

読み込み部か出力部に問題がありそうだったのですが、コードに間違いは見つからずどうしようかと思ってたところある個所に入れた行コメントの\(バックスラッシュ)が右のほうに移動していたので(emacsの自動インデントによる)なんか気持ち悪くて消したら前述のバグが直りました。

問題の部分のコードはこんな感じ。



int print_char(int n) { //文字を出力
char b[2];
int c;
if (Car[n] != S_char) return 0; //型チェック
if (!Displaying) pr("#\\"); // #\
c = cadr(n); //c:文字の値
if (!Displaying && c == ' ') {
pr("space"); //空白
}
else if (!Displaying && c == '\n') {
pr("newline"); //改行
}
else {
b[1] = 0; //null文字
b[0] = c; //文字の値
pr(b); //出力
}
return -1;
}



それで、
if (!Displaying) pr("#\\"); // #\

// #\
を削除してみたらバグが直ったわけです。


行コメント内の\の扱い


通常\(バックスラッシュ)をC言語のプログラム中に書き込むと継続行となり、\の後に改行して書いたコードが\を入れた行のコードと1行でつながっているとみなされます。

この機能が行コメント内でも発揮されていたわけです。つまり
if (!Displaying) pr("#\\"); // #\
に続く、
c = cadr(n); //c:文字の値
がコンパイル時に丸ごとコメントアウトされてました。

実際、
c = cadr(n); //c:文字の値
をコメントアウトするとバグを再現できます。

コメントの中って何を書いてもいいと思ってましたがこんなバグが出るとは、、

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2017/3/7 23:27時点)



苦しんで覚えるC言語

新品価格
¥2,376から
(2017/3/7 23:28時点)



【このカテゴリーの最新記事】
posted by iorisprogramming at 23:04 | Comment(0) | TrackBack(0) | C
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6025615
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
検索
最新記事
最新コメント
カテゴリーアーカイブ
タグクラウド
<< 2018年05月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
プロフィール
さんの画像

情報系を専攻する学生。 しばらく使わなかったりした知識は忘れていくのでこのブログにまとめてみたり。
プロフィール
×

この広告は30日以上新しい記事の更新がないブログに表示されております。