2010-12-14 28 views
7

tôi sử dụng để đi qua C đang có rất nhiều #ifdef, #if#endif chỉ thị mà giữ một số phần tích cực và một số hoạt động phần tùy thuộc vào một số biến được định nghĩa hay không. Tôi đã tìm kiếm thứ gì đó có thể xử lý chúng để tạo mã số cuối cùng C. Nhưng quá trình tiền xử lý cũng thực hiện tương tự cho #include#define. Nhưng tôi muốn giữ chúng.Chế biến một số chỉ để lại những người khác

Vì vậy, có bất kỳ điều gì để xử lý trước các tệp này hoặc dự án với một số bộ lọc không?

Trả lời

0

Tôi giả sử bạn đang sử dụng gcc.

Nếu bạn muốn nói là tất cả #include s, tôi nghĩ bạn cần xóa chúng, mở rộng tệp kết quả bằng gcc -E rồi thêm lại #includes s.

Nếu bạn có nghĩa là chỉ các tiêu đề tiêu chuẩn, tùy chọn -nostdinc có thể giúp bạn làm những gì bạn muốn

[email protected]:~/test/tmp$ cat 4437465.c 
#include <stdio.h> 

#ifndef OUTPUT_TYPE 
#define OUTPUT_TYPE 1 
#endif 

int main(void) { 
#if OUTPUT_TYPE == 1 
    printf("output type 1\n"); 
#elif OUTPUT_TYPE == 2 
    printf("output type 2\n"); 
#else 
    printf("default output type\n"); 
#endif 
    return 0; 
}
[email protected]:~/test/tmp$ gcc -DOUTPUT_TYPE=2 -nostdinc -E 4437465.c 
# 1 "4437465.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "4437465.c" 
4437465.c:1:19: error: no include path in which to search for stdio.h 






int main(void) { 



    printf("output type 2\n"); 



    return 0; 
}
0

những gì bạn muốn có thể thực sự là một ý tưởng tồi, vì có thể có định nghĩa xuất phát từ tính các tệp, mô tả kiến ​​trúc của bạn, ví dụ ... Nhưng bất kỳ IDE hiện đại nào cũng có thể trực quan hóa các chỉ thị tiền xử lý #if.

+0

Đây cũng là suy nghĩ ban đầu của tôi. Nhưng bạn cũng có thể xử lý các tệp được bao gồm và quét chúng để xác định. –

0

Chúng tôi đã sử dụng trình phân tích cú pháp tùy chỉnh để đạt được những gì bạn định làm. Lex & YACC sẽ là một khởi đầu tốt cho công cụ như vậy.

Một lưu ý phụ, đó là một cách thực sự đau đớn để quản lý các phiên bản nhị phân khác nhau trong một cơ sở mã lớn. Nếu có thể, hãy thử cách ly các phần mã tùy chọn của bạn trong các thư viện khác nhau có thể hoặc không thể được bao gồm trong phân phối cuối cùng của bạn dưới dạng thư viện động hoặc tĩnh.

+0

Nếu bạn có thể chia sẻ trình phân tích cú pháp tùy chỉnh đó, nó sẽ tuyệt vời! – kumar

+0

@kumar: thật đáng buồn là tôi không có bất kỳ quyền nào trên đó: ( – Matthieu

2

Có một loạt các chương trình có thể làm điều đó:

  • unifdef - người lớn tuổi nhất
  • sunifdef (Con Unifdef)
  • (Con sunifdef)

tôi đã sử dụng sunifdef rộng rãi trên một số mã rất méo mó và chưa bao giờ tìm thấy nó để phạm sai lầm. Tôi đã sẵn sàng để bắt đầu sử dụng coan ngay bây giờ, mặc dù nó vẫn sẽ được giám sát trong một thời gian. Phiên bản 4.2.2 đã được phát hành hôm nay, 2010-12-20.

Xem thêm: SO 525283

+1

Liên kết của bạn đến các điểm coan cho dự án sai, phải là http://coan2.sourceforge.net/ hoặc http://sourceforge.net/ projects/coan2/ – Hasturkun

+0

@Hatsurkan: Rất tiếc - đó là bất cẩn - cảm ơn những người đứng đầu. –

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