2009-04-16 36 views
7

Làm cách nào để xem các tên bị cắt xén do trình biên dịch tạo ra cho các hàm bị quá tải trong C++? Tôi đang sử dụng VC9 nhưng câu trả lời cho các trình biên dịch khác được chào đón quá.Xem tên trình biên dịch bị cắt xén trong C++

Chỉnh sửa: Tôi tìm thấy tất cả các câu trả lời hữu ích tại đây. Chấp nhận cái tôi thích nhất.

Trả lời

5

Bạn có thể tìm trong tệp bản đồ. Giả sử bạn đã bật tính năng tạo tệp bản đồ.

+0

gì nếu bạn có nhiều quá tải của các chức năng tương tự? –

+0

Sau đó, bạn sẽ thấy nhiều chức năng có cùng tên được bao bọc trong các biểu mẫu bị xáo trộn khác nhau, cho mỗi quá tải. –

+0

Sau đó, bạn sẽ thấy nhiều phiên bản của hàm đó với mỗi phiên bản có dạng tên bị cắt xén. Vì vậy, mục đích của mangling tên, để tránh xung đột tên. –

5

Bạn có thể xem các tên được trang trí (xoài) với Dumpbin.

8

Bạn có thể xem tên chức năng được trang trí bằng cách sử dụng Dependency Walker.

Mở bất kỳ tệp DLL \ EXE nào trong bộ khung phụ thuộc và trong ngăn bên phải, bạn có thể thấy danh sách các tên hàm được trang trí.

6

Vì bạn cũng hỏi về các trình biên dịch khác. Có một công cụ gọi là nm trên gnu toolchain. Bạn sẽ nhận được nó trên Linux và Cygwin, và tôi tin rằng nó cũng có sẵn trong mingw. Gọi nó với không có tham số sẽ hiển thị các biểu tượng bị xáo trộn trong nhị phân. Gọi nó với --demangle sẽ làm rõ ràng.

3

Trong khi tất cả các công trình trên, có cách độc đáo để xem tên bị cắt xén bằng cách sử dụng Listing Files: Trang thuộc tính dự án -> C/C++ -> Tệp đầu ra -> Đầu ra bộ kết xuất.

(EDIT :)

Có một lý do duy nhất Bảng liệt kê các file và DUMPBIN được ghi nhận như là cách để nhìn thấy tên trang trí. Cả tệp bản đồ và tệp phụ thuộc, được đề xuất làm giải pháp, chỉ hiển thị chỉ tên trang trí. Nếu bạn có nhiều tình trạng quá tải của tên hàm, bạn sẽ gặp khó khăn khi kết hợp chúng với các tên trang trí khác nhau mà bạn thấy. (Đó là nhiều hơn hoặc ít hơn xây dựng lại các đề án trang trí. Trong khi possible, nó đánh bại toàn bộ mục đích ban đầu.)

0

lệnh linux gnu chuỗi công cụ nm có thể được sử dụng để xem tên bị cắt xén.

#include<iostream> 
using namespace std; 

int fun1(){} 
int fun1(int){} 
int main() 
{ 
return 0; 
} 
#g++ name_decoration_2.cpp 
#nm a.out 
... 
... 
000000000040064e T _Z4fun1i 
0000000000400648 T _Z4fun1v 
U [email protected]@GLIBCXX_3.4 
U [email protected]@GLIBCXX_3.4 
Các vấn đề liên quan