講師が作成したすべてのCファイルが最初の行の#で始まるのはなぜですか?


431

私はいくつかのCコースのノートを通過します。すべての Cプログラムのソースファイル#は、プログラムの最初の行の1つの行から始まります。

次に、空白行があり、その後にmain関数が続く他のものに続きます。

の理由は何#ですか?

(現在、期限切れであり、実際に質問することはできません。)

次に例を示します。

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}


3
コースノートに最初の例を載せました。文字通り#、次に空白行、そしてプログラムがあります。
メインマン

30
空の主な目的#は難読化です。すべての人を混乱させたい場合は、たとえば、すべてのソースファイルを次の行で開始します#//#BEGIN#\\#(まったく何もしません)。
ランディン2017

3
@Bathshebaそれはおそらくこれらの人々の1人ですcl.cam.ac.uk/people/academic.html
TylerH

7
@Bathsheba最後の1つのショーのタイムスタンプは、質問が出されてから1分後にかなり詳細な回答を示し、C99参照標準からの関連する引用を完了したものです。あなたは間違いなく陰謀者です。おそらくイルミナティで。しかし、両方の質問がどうしてそれほど人気になるのでしょうか?
Nat

回答:


614

うわー、この要件は1970年代にさかのぼります。

事前に標準化されたC のごく初期の段階でプリプロセッサを呼び出したい場合#は、ソースファイルの最初の行の最初にを記述しなければなりませんでした。ファイルの先頭にa のみを書き込む#と、他のプリプロセッサディレクティブを柔軟に配置できます。

偉大なデニス・リッチー自身によるオリジナルのCドラフトから:

12.コンパイラ制御ライン

[...]プリプロセッサを呼び出すには、プログラムの最初の行が#で始まる必要があります。null行はプリプロセッサによって無視されるため、この行に他の情報を含める必要はありません。

そのドキュメントは素晴らしい読み物になります(そして、私が狂った猫のようにこの質問に飛びつくことができました)。

私はそれが単に感傷的である講師であると思う-ANSI C以来それは確かに必要とされなかった


22
私が理解しているように、要件は、最初の文字#自体が行上のaでなければならないということではなく、単にで始まるということな#ので、直接#include?それとも私はそれを間違って理解していますか?
Federico klez Culloca 2017

14
@Bathsheba " このプリプロセッサを呼び出すには、プログラムの最初の行が#で始まる必要があります。プリプロセッサはnull行を無視するため、この行に他の情報を含める必要はありません。 " < -so it することができ、すでに....プリプロセッサディレクティブが含まれているが、それは必要ありません

5
私がC(1980)でプログラミングを始めたとき、それは必要条件ではなかった。ANSI Cは1989
。– pojo-guy 2017

29
@ federico-klez-cullocaインクルードになると、ファイルの先頭に#が付かなくなる可能性があります。将来、誰かが不要なインクルードを削除し、先頭の#の副作用に気付かないためです。
Fadeway 2017

4
@Casanova-いいえ。そのようにしてそのような答えを受け入れると、サイトのルールに違反します。別のアカウントで質問したり回答したりすることは、相互に投票しなくても、サイトのルールの精神に反します。あなた自身の質問に答え、同じアカウントでその答えを受け入れることは害はありません-私は過去にそれをしました。
バトシェバ2017

1

何もしない

C / C ++のISO標準の時点で:

次の形式の前処理ディレクティブ

# new-line

効果はありません。

したがって、今日のコンパイラでは、その空のハッシュは何もしませんnew-line ;機能がないなど)。


PS事前に標準化されたCでは# new-line、重要な役割があり、Cプリプロセッサを呼び出すために使用されていました(@Bathshebaが指摘)。したがって、ここのコードはその期間内に記述されたか、または習慣に由来しています。


-5

Cのコンパイルプロセスについて知っておく必要があります。これは、ソースコードを実行可能バイナリコード(ファイル)に変換する方法を「知っている必要がある」ためです。

コンパイルプロセスから、Cソースコードはプリプロセッサセクションを通過する必要があります。しかし、コンパイラにコードを前処理するように指示するにはどうすればよいですか?...時間記号がコンパイラへの前処理のインジケータに導入されたこと。

たとえば#define PI 3.141、ソースコードにあります。その後、前処理セッション後に変更されます。つまり、すべてのPIは3.141に変更されます。

これと同様#include <stdio.h>に、標準のI / O関数がソースコードに追加されます。

Linuxマシンを使用している場合は、のようにコンパイルしますgcc -save-temps source_code.c。そしてコンパイラの出力を見てください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.