Tại sao tất cả các tệp C được viết bởi giảng viên của tôi bắt đầu bằng một dấu # trên dòng đầu tiên?


431

Tôi đang xem qua một số ghi chú về khóa học C và mọi tệp nguồn chương trình C đều bắt đầu bằng một dòng duy nhất #trên dòng đầu tiên của chương trình.

Sau đó, có các dòng trống và theo sau các công cụ khác theo sau là mainhàm.

Lý do cho là #gì?

(Bây giờ đã hết hạn và tôi thực sự không thể hỏi chap.)

Đây là một ví dụ:

#

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


3
Tôi đặt ví dụ đầu tiên trong ghi chú khóa học lên. Nghĩa đen là có #, sau đó là một dòng trống, sau đó là chương trình.
Nam chính

30
Mục đích chính của trống #là obfuscation. Nếu bạn muốn nhầm lẫn giữa mọi người, ví dụ, bạn có thể bắt đầu tất cả các tệp nguồn của mình bằng dòng #//#BEGIN#\\#(hoàn toàn không có gì).
Lundin

3
@Bathsheba Có lẽ một trong những người này cl.cam.ac.uk/people/academia.html
TylerH

7
@Bathsheba Dấu thời gian trên chương trình cuối cùng đó cho thấy bạn đã trả lời chi tiết hợp lý chỉ một phút sau khi câu hỏi được hỏi, hoàn thành với một trích dẫn có liên quan từ tiêu chuẩn tham khảo C99. Bạn chắc chắn là một người có âm mưu. Có thể trong Illuminati. Làm thế nào cả hai câu hỏi cuối cùng trở nên phổ biến?
Nat

Câu trả lời:


614

Wow, yêu cầu này quay trở lại những năm 1970.

Trong những ngày đầu tiên của C được chuẩn hóa trước, nếu bạn muốn gọi bộ tiền xử lý , thì bạn phải viết một #thứ đầu tiên trong dòng đầu tiên của tệp nguồn. Chỉ viết một #ở đầu tập tin cho phép linh hoạt trong việc đặt các chỉ thị tiền xử lý khác.

Từ một bản nháp C gốc của chính Dennis Ritchie :

12. Dòng điều khiển trình biên dịch

[...] Để khiến [bộ] tiền xử lý được gọi, điều cần thiết là dòng đầu tiên của chương trình bắt đầu bằng #. Vì các dòng null được bỏ qua bởi bộ tiền xử lý, dòng này không chứa thông tin nào khác.

Tài liệu đó làm cho việc đọc tuyệt vời (và cho phép tôi nhảy vào câu hỏi này như một con mèo điên).

Tôi nghi ngờ đó là giảng viên chỉ đơn giản là tình cảm - điều đó chắc chắn không được yêu cầu kể từ ANSI C.


22
Theo tôi hiểu, yêu cầu không phải là chính ký tự đầu tiên phải là #một dòng trên chính nó, chỉ là nó bắt đầu bằng một #, vậy tại sao không đi trực tiếp cho a #include? Hay tôi hiểu nó sai?
Federico klez Culloca

14
@Bathsheba " Để khiến bộ tiền xử lý này được gọi, cần phải có dòng đầu tiên của chương trình bắt đầu bằng #. Vì các dòng null bị bỏ qua bởi bộ tiền xử lý, dòng này không chứa thông tin nào khác. " đã có thể chứa chỉ thị tiền xử lý, nhưng không cần thiết ....

5
Đó không phải là một yêu cầu khi tôi bắt đầu lập trình trong C (1980). ANSI C không được chuẩn hóa cho đến năm 1989.
anh chàng pojo

29
@ federico-klez-culloca Nếu nó trở thành bao gồm, tệp có thể kết thúc mà không có # dẫn bởi vì trong tương lai ai đó sẽ xóa một bao gồm không cần thiết trong khi không biết về tác dụng phụ của việc dẫn #.
Fadeway

4
@Casanova - Không. Làm điều đó và chấp nhận câu trả lời như vậy trái với quy tắc của trang web. Hỏi và trả lời dưới các tài khoản khác nhau là trái với tinh thần của các quy tắc của trang web ngay cả khi không có quyền biểu quyết lẫn nhau, nếu bạn hiểu ý tôi. Không có hại khi trả lời câu hỏi của riêng bạn và chấp nhận câu trả lời đó mặc dù với cùng một tài khoản - tôi đã làm điều đó trong quá khứ.
Bathsheba

1

Không lam gi cả

Theo tiêu chuẩn ISO của C / C ++:

Một chỉ thị tiền xử lý của mẫu

# new-line

không có hiệu lực.

Vì vậy, trong các trình biên dịch ngày nay, hàm băm trống đó không làm gì cả (như- new-line ;không có chức năng).


PS : Trong C chuẩn hóa trước , # new-linecó một vai trò quan trọng, nó được sử dụng để gọi Bộ xử lý trước C (như được chỉ ra bởi @Bathsheba). Vì vậy, mã ở đây hoặc được viết trong khoảng thời gian đó, hoặc xuất phát từ thói quen.


-5

Bạn cần biết về quy trình biên dịch của C. Bởi vì đó là "phải biết" cách mã nguồn chuyển đổi thành mã nhị phân thực thi (tệp).

Từ Quá trình biên dịch, mã nguồn C phải vượt qua Phần tiền xử lý. Nhưng làm thế nào để báo cho Trình biên dịch xử lý trước mã? ... Đó là thời gian # Biểu tượng được đưa vào chỉ báo Tiền xử lý cho trình biên dịch.

Ví dụ #define PI 3.141là trong mã nguồn. Sau đó, nó sẽ được thay đổi sau phiên tiền xử lý. Có nghĩa là, tất cả PI sẽ được đổi thành 3.141.

Giống như #include <stdio.h>, các hàm I / O tiêu chuẩn sẽ được thêm vào mã nguồn của bạn.

Nếu bạn có một máy Linux, hãy biên dịch như thế nào gcc -save-temps source_code.c. Và xem các đầu ra trình biên dịch.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.