เหตุใดไฟล์ C ทั้งหมดที่เขียนโดยอาจารย์ของฉันเริ่มต้นด้วย # ในบรรทัดแรก


431

ฉันกำลังจะผ่านบันทึกย่อของหลักสูตร C และทุกไฟล์ต้นฉบับของโปรแกรม C เริ่มต้นด้วย#บรรทัดเดียวในบรรทัดแรกของโปรแกรม

จากนั้นมีบรรทัดว่างและติดตามสิ่งอื่นตามด้วยmainฟังก์ชัน

เหตุผลสำหรับการ#คืออะไร?

(ตอนนี้หมดระยะเวลาแล้วและฉันก็ไม่สามารถถามได้เลย)

นี่คือตัวอย่าง:

#

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


3
ฉันยกตัวอย่างแรกในบันทึกหลักสูตร แท้จริง#แล้วมีบรรทัดว่างแล้วโปรแกรม
ชายหลัก

30
วัตถุประสงค์หลักของความว่างเปล่า#คือความงงงวย หากคุณต้องการสร้างความสับสนให้กับทุกคนคุณสามารถเริ่มต้นไฟล์ต้นฉบับทั้งหมดด้วยบรรทัด#//#BEGIN#\\#(ซึ่งไม่ทำอะไรเลย)
Lundin

3
@Bathsheba มันอาจเป็นหนึ่งในคนเหล่านี้cl.cam.ac.uk/people/academic.html
TylerH

7
@Bathsheba การประทับเวลาของรายการล่าสุดนั้นแสดงว่าคุณให้คำตอบโดยละเอียดอย่างสมเหตุสมผลเพียงหนึ่งนาทีหลังจากที่คำถามถูกถามพร้อมด้วยคำพูดที่เกี่ยวข้องจากมาตรฐานอ้างอิง C99 คุณเป็นคนสมรู้ร่วมคิดอย่างแน่นอน อาจเป็นไปได้ในอิลลูมินาติ ทำไมทั้งสองคำถามถึงได้รับความนิยม?
Nat

คำตอบ:


614

ว้าวข้อกำหนดนี้ย้อนกลับไปในช่วงทศวรรษ 1970

ในวันแรก ๆของ C ที่ได้มาตรฐานล่วงหน้าหากคุณต้องการเรียกใช้ตัวประมวลผลล่วงหน้าคุณต้องเขียน#สิ่งแรกในบรรทัดแรกของไฟล์ต้นฉบับ การเขียนเฉพาะ a #ที่ด้านบนของไฟล์นั้นจะช่วยให้มีความยืดหยุ่นในการวางคำสั่ง preprocessor อื่น

จากร่าง C ดั้งเดิมโดย Dennis Ritchie ผู้ยิ่งใหญ่ :

12. สายควบคุมคอมไพเลอร์

[... ] เพื่อที่จะทำให้ [pre] ตัวประมวลผลที่จะเรียกมันเป็นสิ่งจำเป็นที่บรรทัดแรกของโปรแกรมเริ่มต้นด้วย # เนื่องจากตัวประมวลผลก่อนละเว้นบรรทัด null บรรทัดนี้จึงไม่มีข้อมูลอื่น

เอกสารนั้นทำให้อ่านได้ดีมาก (และอนุญาตให้ฉันโดดคำถามนี้เหมือนแมวบ้า)

ฉันสงสัยว่ามันเป็นวิทยากรที่มีอารมณ์อ่อนไหว - ไม่จำเป็นต้องใช้อย่างแน่นอนตั้งแต่ ANSI C


22
ตามที่ฉันเข้าใจแล้วความต้องการไม่ใช่ว่าตัวละครตัวแรกจะต้องอยู่#ในสายของตัวเองเพียงแค่มันเริ่มต้นด้วยตัวเองแล้ว#ทำไมไม่ไปหามันโดยตรง#includeล่ะ? หรือฉันเข้าใจผิด
Federico klez Culloca

14
@Bathsheba " ในการทำให้ตัวประมวลผลล่วงหน้านี้ถูกเรียกใช้จำเป็นต้องให้บรรทัดแรกของโปรแกรมเริ่มต้นด้วย # เนื่องจากบรรทัดว่างจะถูกละเว้นโดยตัวประมวลผลก่อนบรรทัดนี้จึงไม่มีข้อมูลอื่น " <- ดังนั้นสามารถมีคำสั่ง preprocessor แล้ว แต่ไม่จำเป็น ....

5
มันไม่ได้เป็นข้อกำหนดเมื่อฉันเริ่มเขียนโปรแกรมใน C (1980) ANSI C ไม่ได้มาตรฐานจนกระทั่ง 1989
pojo-guy

29
@ federico-klez-culloca หากมันกลายเป็นการรวมไฟล์อาจท้ายโดยไม่มี # นำหน้าเพราะในอนาคตบางคนจะลบการรวมที่ไม่จำเป็นออกไปในขณะที่ไม่ทราบผลข้างเคียงของการเป็นผู้นำ #
Fadeway

4
@Canova - ไม่การทำเช่นนั้นและการยอมรับคำตอบนั้นขัดกับกฎของเว็บไซต์ การถามและตอบภายใต้บัญชีที่แตกต่างนั้นขัดต่อจิตวิญญาณของกฎของไซต์แม้ว่าจะไม่ได้ลงคะแนนร่วมกันหากคุณได้รับความหมายของฉัน ไม่มีอันตรายใด ๆ ในการตอบคำถามของคุณและยอมรับคำตอบนั้นด้วยบัญชีเดียวกัน - ฉันเคยทำมาแล้วในอดีต
Bathsheba

1

ไม่ทำอะไรเลย

ตามมาตรฐาน ISO ของ C / C ++:

คำสั่ง preprocessing ของแบบฟอร์ม

# new-line

ไม่มีผล

ดังนั้นในคอมไพเลอร์ของวันนี้แฮที่ว่างเปล่าไม่ได้ทำอะไร (เหมือน - new-line ;ไม่มีฟังก์ชั่น)


PS : ในก่อนมาตรฐาน C , # new-lineมีบทบาทสำคัญมันถูกใช้ในการเรียก C Pre-Processor (เป็นแหลมออกโดย @Bathsheba) ดังนั้นรหัสที่นี่ถูกเขียนขึ้นในช่วงเวลานั้นหรือมาจากนิสัย


-5

คุณจำเป็นต้องรู้เกี่ยวกับกระบวนการรวบรวมของ C เพราะนั่นคือ "ต้องรู้" ว่าซอร์สโค้ดแปลงเป็นไฟล์ไบนารีที่ปฏิบัติการได้อย่างไร

จากกระบวนการรวบรวมรหัสต้นฉบับ C จะต้องข้ามส่วนตัวประมวลผลล่วงหน้า แต่จะบอกให้คอมไพเลอร์ประมวลผลรหัสล่วงหน้าได้อย่างไร ... เวลานั้น Symbol # ถูกนำไปใช้กับตัวบ่งชี้ของ Preprocess ให้กับคอมไพเลอร์

ตัวอย่างเช่น#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.