2009-11-17 29 views
14

Có thể thông báo cho bộ xử lý trước C để kiểm tra xem một hàm (không phải macro) có được khai báo không? Tôi đã thử những điều sau nhưng có vẻ như không hoạt động:Kiểm tra xem chức năng có được khai báo bằng bộ tiền xử lý C không?

#include <stdio.h> 

int main(void) 
{ 
#if defined(printf) 
    printf("You support printf!\n"); 
#else 
    puts("Either you don't support printf, or this test doesn't work."); 
#endif 
    return 0; 
} 
+0

Tôi rất quan tâm đến lý do cho việc này. Các libs bạn đang làm việc với phải nhất quán, để lấy ví dụ của bạn: Sẽ không có một stdio.h mà không có printf và nếu printf có thể được gỡ bỏ trong một tương lai xa, bạn sẽ không biết bây giờ thay thế sẽ được gọi là. – flokra

+0

Tôi nghĩ rằng nó không dành cho printf cụ thể, chỉ là bất kỳ tên hàm nào. Nhưng, nếu bạn muốn biết các chức năng ở đó, chỉ cần gọi nó - lỗi trình biên dịch sẽ cho bạn biết :-) – paxdiablo

+5

Khuyến khích chính của tôi là kiểm tra các chức năng như bcopy() hoặc arc4random() (khi viết các chương trình đa nền tảng) , không phải lúc nào cũng được xác định. – Michael

Trả lời

21

No. Preprocessor chạy trước trình biên dịch C và trình biên dịch hàm C. Bộ tiền xử lý chỉ có sẵn để xử lý văn bản.

Tuy nhiên, hầu hết các tệp tiêu đề đều có macro bảo vệ như _STDIO_H_ mà bạn có thể kiểm tra trong giai đoạn tiền xử lý. Tuy nhiên, giải pháp đó không phải là di động vì các tên macro bảo vệ bao gồm không được chuẩn hóa.

0

Vì bộ tiền xử lý không nhận thức được ngôn ngữ C/C++ (nó thực sự chỉ thay thế văn bản), tôi đoán rằng điều này là không thể. Tại sao bạn muốn làm nó? Có thể có một cách khác.

1

Bộ tiền xử lý là một chương trình đơn giản và không biết gì về ngôn ngữ cơ bản. Nó không thể nói nếu một hàm đã được khai báo. Ngay cả khi nó có thể, chức năng có thể được định nghĩa trong một thư viện khác và biểu tượng được giải quyết trong quá trình liên kết, do đó, bộ tiền xử lý không thể giúp đỡ về vấn đề đó.

5

Nếu bạn nhìn vào các công cụ như autoconf, bạn sẽ thấy rằng chúng trải qua nhiều thử nghiệm để xác định máy tính có hoặc không có, để biên dịch đúng, sau đó chúng đặt đúng #DEFINES.

Bạn có thể muốn xem mô hình đó, và công cụ đó nếu bạn đang ở trên một số hương vị của unix, như những gì bạn muốn làm là sẽ không thể, như những người khác chắc chắn đang chỉ ra.

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