2010-03-01 40 views
5

Nó chỉ là để thử nghiệm biên dịch một chương trình đơn giản, với tập tin tiêu đề # bao gồm trong nó?Cách tốt nhất để lập trình kiểm tra sự tồn tại của tập tin tiêu đề?

Để hiểu rõ hơn về quy trình biên dịch, tôi đang viết "cấu hình" của riêng mình, kiểm tra sự tồn tại của một vài tệp tiêu đề và thư viện.

+0

Bạn có tên tệp và danh sách thư mục bao gồm. Tại sao không chỉ kiểm tra xem tập tin có trong bất kỳ tệp nào không? –

+1

@Nikolai: một lý do để không chỉ làm điều đó là tiêu đề 'tiêu đề' có thể bao gồm các tệp khác và khó kiểm tra xem các tệp đó phụ thuộc vào hiện tại hay không bằng cách kiểm tra xem chúng có tồn tại hay không thử biên dịch. –

+0

@ Jonathan: Tôi hiểu điều đó. Tất nhiên nó hoàn toàn phụ thuộc vào phạm vi của dự án, nhưng tôi sẽ thực hiện tìm kiếm đệ quy cho các chỉ thị 'include'. –

Trả lời

6

Có, sử dụng trình biên dịch để biên dịch chương trình thử nghiệm đơn giản của bạn. Đó là cách tốt nhất và dễ nhất để xem trình biên dịch có thể tìm tiêu đề hay không. Nếu bạn mã cứng # bao gồm các đường dẫn tìm kiếm, bạn sẽ luôn phải sửa đổi và thích ứng với các trình biên dịch khác nhau.

+0

Đồng ý; Như Jonathan Leffler lưu ý, đây là cách Autoconf làm điều đó, ít nhất là một cuộc bỏ phiếu hợp lý về kinh nghiệm có lợi cho nó. –

4

Kiểm tra bộ lọc GNU Autoconf cho tiêu đề bằng cách chạy tập hợp thử nghiệm. Chỉ cần kiểm tra sự tồn tại của một tệp 'filename.h' khá đơn giản:

#include <filename.h> 
int main(void){return 0;} 

Bạn có thể thích báo giá thay vì dấu ngoặc nhọn.

-1

Sử dụng chương trình sau, bạn có thể tìm thấy sự tồn tại của tệp tiêu đề.

#include<stdio.h> 
main() 
{ 
     FILE * file; 
     if ((file = fopen("/usr/include/stdio.h", "r"))!=NULL) 
     { 
       fclose(file); 
       printf("true"); 
     } 
     perror("err"); 

} 
+1

Phê bình? Đã sửa tên cho tệp bạn đang tìm kiếm. Đã sửa vị trí cho tệp bạn đang tìm kiếm. Sử dụng tệp bạn đang tìm kiếm khi biên dịch chương trình bạn đang sử dụng để tìm kiếm. In ấn trạng thái trên stdout khi OK và trên stderr khi không. Không trả về các trạng thái thoát khác nhau để thành công và thất bại. Sử dụng định nghĩa C cổ về chính - C99 yêu cầu 'int main()' hoặc 'int main (void)', vì vậy đây phải là C89 hoặc mã cũ hơn. Thật không may, chỉ C99 đảm bảo một trạng thái thoát zero từ main() khi bạn không đặt trong một sự trở lại rõ ràng, vì vậy trạng thái thoát là không xác định. –

+0

Điều này sẽ không có tác dụng nói chung. –

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