2013-09-30 12 views
15

Tôi mới tham gia lập trình c và tôi đã viết mã một số chương trình đơn giản "Xin chào thế giới".#include <stdio.h> thực sự làm gì trong chương trình c

Trong tất cả các chương trình này, tôi đặt #include<stdio.h> ở trên cùng nhưng tôi không chắc điều này có nghĩa là chính xác. Tôi googled nó và tôi thấy rằng stdio.h là một tập tin có lệnh cho preprocessor, nhưng một preprocessor là gì? Tôi nghĩ khi tôi viết mã, tôi biên dịch nó và mã của tôi biến thành một dạng mà "máy tính" có thể đọc và sau đó tôi có thể chạy nó. Ai đó có thể giải thích cho tôi biết cách sử dụng lệnh này là gì?

+0

http://en.wikipedia.org/wiki/C_preprocessor –

+0

@ Nat95 SO không phải là Diễn đàn nơi bạn chỉ sjuld trình bày giải pháp, SO muốn truyền bá kiến ​​thức. Vì vậy, câu trả lời trong biểu mẫu của một liên kết duy nhất không được chào đón để ngăn xếp tràn. Một câu trả lời nên được viết bởi một số người BIẾT câu trả lời. và có thể giải thích cho bạn.vì vậy, tránh yêu cầu liên kết hoặc tài nguyên ngoài trang web. – dhein

+1

ok! tôi không biết điều này! thanks @Zaibis – yaylitzis

Trả lời

26

Tìm kiếm tệp stdio.h và sao chép một cách hiệu quả nó ở vị trí của câu lệnh #include này. Tệp này chứa các hàm nguyên mẫu chức năng như printf(), scanf(), ... để trình biên dịch biết các tham số và giá trị trả về của chúng là gì.

+0

ok, vì vậy khi tôi sử dụng printf mã thực hiện printf nằm trong stdio.h? Tôi có thể thực hiện phiên bản printf của tôi (tôi biết điều này là ngớ ngẩn để làm điều đó, nhưng cho phép nói ..)? – yaylitzis

+0

@ Nat95: Không, mã cho hàm printf không có trong stdio.h, chỉ là định nghĩa hàm. Trình liên kết sau đó giải quyết vấn đề này khi liên kết với thư viện chuẩn. Bạn hoàn toàn có thể viết chức năng printf của riêng bạn. – Lucas

+0

+1 đây là giải thích tốt nhất và đơn giản nhất về những gì mà bộ tiền xử lý hiệu quả với #include. Btw bạn có thể thấy điều này nếu bạn hướng dẫn trình biên dịch/xây dựng hệ thống để giữ các tập tin được xử lý trước. – stijn

9

Giải thích đơn giản nhất có thể là chương trình của bạn gọi hoặc sử dụng nhiều chức năng có mã không thuộc chính chương trình của bạn. Ví dụ: nếu bạn viết "printf" trong mã của bạn để in một cái gì đó, trình biên dịch không biết phải làm gì với cuộc gọi đó.

stdio.h là nơi chứa thông tin cho printf đó.

Cập nhật:

Thay các nguyên mẫu hàm printf (tên, kiểu trả về và các thông số) cư trú tại stdio.h. Đó là tất cả các yêu cầu trong giai đoạn biên dịch. Mã printf thực tế được bao gồm trong pha liên kết, nó xuất hiện sau khi biên dịch.

Tuyên bố bao gồm về cơ bản sẽ chèn tất cả các mẫu thử chức năng TRƯỚC KHI biên dịch thực tế. Do đó tên tiền xử lý.

Cập nhật 2:

Kể từ khi câu hỏi tập trung vào bao gồm tuyên bố (và OP cũng hỏi về cách viết định nghĩa các chức năng chính mình, một khía cạnh quan trọng là nếu nó được viết như thế (chú ý dấu ngoặc góc)

#include <stdio.h> 

các preprocessor giả định, nó là một tiêu đề thư viện tiêu chuẩn và trông trong các thư mục hệ thống đầu tiên nơi trình biên dịch đã được cài đặt.

Nếu thay vì một pro ngữ pháp định nghĩa một hàm của mình và đặt file .h trong thư mục làm việc hiện tại, ông sẽ sử dụng (lưu ý có dấu ngoặc kép)

#include "stdio.h" 

Following minh họa nó và hành vi này là xách tay trên tất cả các nền tảng.

+0

ok, vì vậy khi tôi sử dụng printf mã thực hiện printf nằm trong stdio.h? Tôi có thể thực hiện phiên bản printf của tôi (tôi biết điều này là ngớ ngẩn để làm điều đó, nhưng cho phép nói ..)? – yaylitzis

+0

Có, bạn có thể làm điều đó. Hãy hiểu rằng câu trả lời trên của tôi là đơn giản. Nhưng đó là khái niệm đúng đắn để bắt đầu. Khi chúng ta đi sâu, bạn có thể thấy nhiều chi tiết. Tôi thực sự đã viết một phiên bản mới hơn của printf trong khóa học lập trình đầu tiên của tôi về BSc hơn một thập kỷ trước. Điều đó liên quan trực tiếp truy cập vào bộ nhớ video và viết trên các địa chỉ cụ thể thông qua con trỏ. – fayyazkl

+0

Để làm rõ, có các tệp .h và có các tệp .c. Các tệp h chỉ chứa các nguyên mẫu hàm tức là cho biết tên hàm, kiểu trả về và các tham số là gì. Định nghĩa thực tế nằm trong pha liên kết, nó xuất hiện sau khi biên dịch. – fayyazkl

0

Nó yêu cầu trình biên dịch sử dụng các hàm, cấu trúc, macro và v.v. từ tệp sdtio.h, đại diện cho một phần của glibc (hoặc bất kỳ thư viện C standart nào bạn có). Trình biên dịch cũng thêm bản ghi vào "danh sách liên kết" thực thi đầu ra, mà nó phải được liên kết với thư viện standart C.

Các vấn đề liên quan