2017年03月07日
C言語の行コメント内にバックスラッシュ(\)を入れると次の行がコメントアウトされることがある
S9fESを一通りやり終わったのですが完成したプログラムがバグってました。原因が行コメントに入っていた\(バックスラッシュ)で予想外だったうえに解決に時間がかかったのでメモして起きます。
S9fES完成後にいろいろ動かしていたのですが
読み込み部か出力部に問題がありそうだったのですが、コードに間違いは見つからずどうしようかと思ってたところある個所に入れた行コメントの\(バックスラッシュ)が右のほうに移動していたので(emacsの自動インデントによる)なんか気持ち悪くて消したら前述のバグが直りました。
問題の部分のコードはこんな感じ。
それで、
通常\(バックスラッシュ)をC言語のプログラム中に書き込むと継続行となり、\の後に改行して書いたコードが\を入れた行のコードと1行でつながっているとみなされます。
この機能が行コメント内でも発揮されていたわけです。つまり
実際、
コメントの中って何を書いてもいいと思ってましたがこんなバグが出るとは、、
//を使用した行コメントに\を入れると発生するバグ
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言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
新品価格 |
【このカテゴリーの最新記事】
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6025615
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック