
ある本に次のような例題がありました。
「不正なヘッダ」
#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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
LaTeX: captionの中で改行した...
-
VBAのコマンドボタンの文字列の...
-
[PHP]formのtextareaの改行を消...
-
VBSにて改行コードの検出・置換
-
テキストファイルの指定文字列表示
-
C#の改行について
-
改行コードについて
-
texのchapterが改行される
-
改行文字を消す方法を教えて頂...
-
○個ずつ改行
-
C# DataGridViewのセルを改行禁...
-
マクロでセル内の改行を削除す...
-
textarea , PHP, 確認画面 改行
-
プログラムについて。
-
C言語について。
-
エクセルで改行はどうやるんで...
-
テキストファイルへの書き出し
-
エクセルVBA 文字列領域が不足...
-
1行ごとに取得して、その改行...
-
コンボボックスの項目中に改行を
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
改行について
-
エクセルVBA 文字列領域が不足...
-
最終行の改行について
-
テキストボックス行の桁数を制...
-
【VBA】エクセルで最後の不要な...
-
awkで改行を除いて文字列を抜き...
-
グレープシティのSPREAD...
-
VBAでCSVをExcelに取り込む時に...
-
秀丸の正規表現で複数行にわた...
-
C# DataGridViewのセルを改行禁...
-
JavaMail,本文中の改行について
-
テキストファイルから改行コー...
-
vb.netでのリッチテキストボッ...
-
ラベル(スタティックテキスト)...
-
jsp 改行コードで改行させて表...
-
COBOLの改行
-
文字列型変数に1024を超えた文...
おすすめ情報