2012-02-22 31 views
8

Tôi có tệp C cần tệp tiêu đề cụ thể. Nếu tập tin tiêu đề đó không tồn tại, tôi muốn bộ tiền xử lý đưa ra cảnh báo cụ thể. Một cái gì đó như:Trình tiền xử lý C có thể phát hiện nếu không thể tìm thấy tệp tiêu đề và đưa ra cảnh báo cụ thể không?

#if !(#include <special.h>) 
#warning "Don't worry, you can fix this." 
#warning "You just need to update this other repo over here:" 
#endif 

Đây có phải là có thể với C tiền xử lý?

+0

Có thể trong tệp makefile. –

+2

bạn thường làm điều đó với tập lệnh './Configure' –

+0

có thể trùng lặp của [Bộ tiền xử lý C có thể được sử dụng để cho biết tệp có tồn tại không?] (Http://stackoverflow.com/questions/142877/can-the-c -preprocessor-be-used-to-tell-if-a-file-tồn tại) –

Trả lời

9

Bạn luôn có thể kiểm tra nếu #define X vĩ mô, từ các tập tin cũng vậy, có ... định nghĩa :)

+1

Và nó giúp ích như thế nào? – asaelr

+0

@asaelr Không chắc chắn nếu điều này là đúng cho tất cả mọi người, nhưng trong xây dựng của tôi thiết lập PP/CC sẽ dũng cảm bấm vào nếu nó không thể tìm thấy một tập tin bao gồm. Vì vậy, '#include ' theo sau bởi '#ifndef __SPECIAL_H__' hoạt động cho tôi –

7

Không, đây là không thể. Tất cả những gì bạn có thể làm là cố gắng #include tiêu đề, và nếu nó không tồn tại, trình biên dịch sẽ cung cấp cho bạn một lỗi.

Cách khác là sử dụng công cụ như GNU autoconf. autoconf tạo ra một kịch bản lệnh gọi là configure phân tích hệ thống xây dựng của bạn và xác định những thứ như bạn có cài đặt các tệp tiêu đề nhất định hay không và nó tạo tệp tiêu đề bao gồm các macro cho biết thông tin đó.

Ví dụ, nó có thể xác định HAVE_SYS_TIME_H nếu xây dựng hệ thống của bạn bao gồm tiêu đề <sys/time.h>, vì vậy sau đó bạn có thể viết mã như:

#if HAVE_SYS_TIME_H 
#include <sys/time.h> 
#else 
#warning "Don't worry, you can fix this." 
#endif 
+1

yepp, nhưng nó có ý nghĩa hơn để đưa ra cảnh báo/lỗi từ kịch bản cấu hình ... –

-3

Nếu tất cả bạn cần là một cảnh báo rằng tập tin tiêu đề là không có (và không có mã tùy chỉnh), sau đó hầu hết các trình biên dịch sẽ cung cấp cho bạn một.

$ LC_MESSAGES=en_US gcc -c bar.c 
bar.c:1:17: fatal error: foo.h: No such file or directory 
compilation terminated. 
+6

Vì vậy, một lỗi nghiêm trọng và cảnh báo là khá nhiều điều tương tự cho bạn, phải không? –

12

Tôi biết đây là một câu hỏi cũ, nhưng tôi cũng cần một cách để làm điều này và tôi đã thất vọng khi đọc những câu trả lời này. Nó chỉ ra rằng clang có một chỉ thị __has_include("header name") tốt đẹp hoạt động hoàn hảo để làm những gì bạn cần :) Có thể bạn muốn kiểm tra xem chỉ thị có sẵn trước hay không bằng cách gọi #if defined(__has_include)

+5

[gcc cũng có điều này] (https://gcc.gnu.org/gcc-5/changes.html). Nó nói gcc 5, nhưng 4,9 dường như làm việc tốt cho tôi. –

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