2011-09-13 27 views
6

Tôi (đang) sử dụng các macro __FILE____LINE__ để in các thông báo chẩn đoán ra khỏi mã của tôi. Điều này làm việc khá tốt khi bạn sử dụng GCC với thực hiện, các tập tin là ngắn như bạn chỉ định nó trên dòng lệnh. Gần đây tôi đã chuyển sang sử dụng CodeLite sử dụng tên tệp đủ điều kiện (ít nhất là dưới cửa sổ) khi xây dựng. Đột nhiên, đầu ra chẩn đoán của tôi gần như không thể đọc được.Làm cách nào để chỉ lấy tên tệp trong bộ tiền xử lý?

Có cách nào để chỉ lấy thành phần tệp của tên tệp trong bộ tiền xử lý không? Tôi có thể sống với một giải pháp cụ thể GCC không di động. (Tôi sẽ quay trở lại đồng bằng __FILE__ các trường hợp khác.)

Chắc chắn tôi có thể chuyển nội dung của __FILE__ thông qua chức năng và chỉ trích xuất thành phần tệp, nhưng thao tác chuỗi không phải là điều tôi đã lưu ý đối với các thông báo chẩn đoán không thay đổi hành vi thời gian chạy ...

LƯU Ý: Tôi sử dụng tên tệp theo cách mà GNU sử dụng. Đường dẫn là tập hợp tên tệp và tên tệp là số nhận dạng tương đối hoặc tuyệt đối của tệp. Tên tệp có thể được tạo thành từ thành phần thư mục và thành phần tệp.

+0

Chẩn đoán thay đổi hành vi thời gian chạy (nếu không sẽ không có chẩn đoán) và liệu bạn gọi một hàm bổ sung có tạo ra sự khác biệt nhỏ không, vì bản thân đầu ra đang gọi hàm thư viện để thực hiện đầu ra. – eudoxos

+0

In thông báo chẩn đoán thường liên quan đến, ngoài hàng tá hoạt động chuỗi, một số hành động I/O tệp không phải là rất lành tính. Vì một lý do nào đó dường như không ai lo lắng về điều này. Tại sao phải lo lắng về việc thêm một cuộc gọi đến một chức năng không có tác dụng phụ khác mà chỉ ảnh hưởng đến các thông báo chẩn đoán? –

+0

Cả hai đều đúng, việc thêm chẩn đoán không có hiệu lực miễn phí. Tôi đã thực hiện nó theo cách đó, tôi để nó đi qua một hàm. Tôi đã tự hỏi nó giống như nó tồn tại. Nó chắc chắn không phải là tiêu chuẩn, nhưng việc tìm kiếm tài liệu về điều này là không hoàn hảo. (Ngay cả hướng dẫn gcc không phác thảo mọi macro được xác định trước.) – rioki

Trả lời

3

Không có macro tiền xử lý đã biết nào cung cấp chức năng. Đi qua __FILE__ thông qua một đường nối chức năng như tùy chọn hợp lý duy nhất.

+0

Đối với gcc, có [\ _ \ _ BASE_FILE \ _ \ _] (https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html). – fret

+1

@fret: đối với tôi, '__BASE_FILE__' xuất ra giống như' __FILE__'. Nếu bạn đọc tài liệu mà bạn đã liên kết, nó cung cấp tên (không nhất thiết tên cơ sở) của tệp với hàm 'main' (không phải tệp hiện tại, thậm chí). – JellicleCat

+1

@ JellicleCat bạn đúng ... – fret

8

Nếu bạn đang sử dụng GNU Thực hiện sau đó bạn có thể chỉ cần vượt qua -D BASE_FILE_NAME = \ "$ *. C \" trong giai đoạn tiền xử lý biên dịch (nếu bạn đang làm riêng, hoặc biên dịch nếu trong một đơn giai đoạn, đó là tiêu chuẩn).

Điều này phụ thuộc vào cách bạn đã xác định tên tệp của mình. Tôi đến từ một danh sách các tên tập tin đơn giản và được tiền tố với các thư mục bằng cách sử dụng các hàm trong makefile ở giai đoạn sau.

IE, điều này phù hợp với tôi, nhưng số dặm của bạn có thể thay đổi! :-)

Một phiên bản đơn giản thực hiện của tôi "code":

CLASSES = main.c init.c 

PREPROCESSED = $(patsubst %.c,$(PPCDIR)/%.pp.c,$(CLASSES)) 

$(PREPROCESSED): $(PPCDIR)/%.pp.c: %.c $(ALLH) 
    $(GCC) $(GCCOPTS) -D BASE_FILE_NAME=\"$*\" -E $< > [email protected] 

Các chỉ cần sử dụng BASE_FILE_NAME trong mã của bạn như bạn thích :-)

+0

Thật không may tôi đang làm việc với CodeLite, tạo ra các makefiles cho tôi. Sử dụng CodeLite là tuyệt vời, cho đến khi bạn muốn làm một cái gì đó mà rơi ra khỏi tiêu chuẩn. Ideea vẫn đẹp, +1 – rioki

+0

Ý tưởng tương tự có thể được sử dụng trong Visual Studio. Trong Visual Studio 2008: nhấn chuột phải vào tệp dự án (.vcproj) -> Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions. Thêm __BASE_FILE __ = \ "$ (InputFileName) \". Bạn có thể sử dụng __BASE_FILE__ thay vì __FILE__ trong tệp nguồn của mình. – user720594

4

Trong thư trả lời để FredCooke ở trên, bạn có thể trao đổi dòng này:

-D BASE_FILE_NAME=\"$*.c\" 

Với:

-D BASE_FILE_NAME=\"$(<F)\" 

Điều này sẽ cung cấp cho bạn mở rộng tên tập tin thích hợp, cho .cpp là tốt.

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