ある本に次のような例題がありました。
「不正なヘッダ」
#define max(a,b) ((a)>(b)?(a):(b)) EOF
「正しいヘッダ」
#define max(a,b) ((a)>(b)?(a):(b)) ←Enterキー
EOF
ここで”不正なヘッダ”でコンパイルするとエラー表示のメッセージが表示され、その理由は”前処理指令は改行文字で終了しなければならない”との事です。又処理系によっては”不正なヘッダ”(改行文字なし)が許されるものもあると書かれていました。しかしその場合、可搬性は損なわれると書いてありました。私の処理系はRedHat Linuxでviを使っています。私の処理系で”不正なヘッダ”でコンパイルしてもなんらメッセージが無くコンパイルできました。
はたしてこの場合可搬性はあるのでしょうか?
又その本には”ソースファイルの最後の行にも必ず改行文字をつけよう”と書いてありました。しかしviを使っていてcプログラムとしてソースファイルを書いている時、最後に改行文字を入れた事はありませんでした。この場合も可搬性は失われるのでしょうか。
宜しく願います。
No.5
- 回答日時:
>可搬性はあるのでしょうか?
・・・と聞かれれば、「ない」とお答えすることになります。
コンパイラも方言があります。
ここで言う方言は、言語上でなく、行末の改行などの扱い方です。
経験上、複数のコンパイラを使ってますと必ず問題になります。
改行以外によくある問題は、コメントのネストや文中のEOF、コードとみなされない文字の扱い、インクルードファイル側の問題などです。
C言語だけではありません。
アセンブリ言語にも同様の問題がよく発生します。
makeがソースファイルを吐き出すときなどは、特に注意が必要です。
問題を回避するには、”安全な書き方”しかありません。
No.3
- 回答日時:
前処理指令云々ではなく、空ではないソースファイルが改行以外で終わる場合、未定義の動作になります。
例えば、int main(void)
{
...
}<EOF>
のような場合も同様に未定義の動作になります。
未定義の動作ですから、当然可搬性はありません。
No.2
- 回答日時:
世の中に
A. ヘッダ(ソースコード)ファイルの末尾に改行がないとエラーになる処理系
B. ヘッダ(ソースコード)ファイルの末尾に改行がなくてもエラーにならない処理系
が存在するとして、
ソースコード(ヘッダ)の最後に改行を入れておけば処理系AでもBでもエラーにならないのに対して、改行を入れないでおくと処理系BではOKですが処理系AではNGです。
なので、別に改行を入れたって困るわけでなし入れておきましょう(その方が安全)ということです。
上の例で処理系Bを使っていたからエラーになっていなかったコードを処理系Aの環境に持って行ったらエラーでコンパイルできなくなることを「可搬性がない」と言っています。
あなたが書いた「不正なヘッダ」は、たまたまあなたの環境が上で言う処理系Bの環境だったからよかったわけで、世の中のどこかにある処理系Aに持ち込んだとたんにエラーになるのです。つまり「可搬性がない」(あなたのプログラムは処理系Aの環境に持ち込もうと思ったら改行を追加して回らないとエラーでコンパイルできない)ということです。
しつこいようですが、「可搬性がある」というのはある環境で(たまたま)動いたのでどうだという話ではなくて、世の中のおよそ思いつくどこに持っていっても動くようになっているという状態を指し示しています。
だから、自分の環境でたまたまコンパイルできたからと言って「可搬性がある」などとは言えません。あなたの知らない、でもその本の著者が知っているある環境でも動くようにしておくとよいよ、ということです。
No.1
- 回答日時:
#defineで定義するなら改行は必須でしょう。
なぜなら一行単位で解析されるものだからです。
そもそも2行以上になるときはなぜ行末に\が必要なのでしょうか?
それを考えたら自明かと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/04/21 08:59
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- その他(パソコン・スマホ・電化製品) ワードでテキストボックス内の文字を連動させない方法 2 2023/02/09 16:56
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- 政治 日本で梅毒が増え続けているのは自民党が性犯罪に甘いからですよね? 7 2022/11/04 11:25
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- 法学 不正アクセス禁止法の扱いについて 4 2022/03/23 18:13
- Excel(エクセル) Excelのマクロについてご教授ください 2 2023/02/25 09:43
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
エスケープ文字の復帰(¥r)と...
-
テキストファイルから改行コー...
-
LaTeX: captionの中で改行した...
-
delphi でのコード上でTab を入...
-
Memoコントロールの1行あたりの...
-
VBAでCSVをExcelに取り込む時に...
-
英文のピリオドでのみの改行の仕方
-
ダイアログにおける改行
-
VC++のボタン
-
選択したセルでダブルクリック...
-
C#の改行について
-
JavaDoc コメントの改行について
-
ソースコードの1行が長いとき...
-
fgetsなどをもちいて「改ページ...
-
COBOLの改行
-
ファイルから読み取った改行文...
-
vb.netでのリッチテキストボッ...
-
FORTRANで作成したテキストファ...
-
C#における改行を含む文字の探索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
LaTeX: captionの中で改行した...
-
改行について
-
改行を読み飛ばす
-
texのchapterが改行される
-
テキストボックス行の桁数を制...
-
C# DataGridViewのセルを改行禁...
-
awkで改行を除いて文字列を抜き...
-
JavaMail,本文中の改行について
-
COBOLの改行
-
jsp 改行コードで改行させて表...
-
グレープシティのSPREAD...
-
C++でのCRLFについて
-
JavaDoc コメントの改行について
-
最終行の改行について
-
VBAでCSVをExcelに取り込む時に...
-
ファイルから読み取った改行文...
-
C言語の標準入力で改行しない方法
おすすめ情報