2013-06-25 23 views
7

chức năng tôi đã quá tải như:Làm thế nào để biên dịch mã C++ trong gcc (g ++) để xem tên mangling trên các hàm bị quá tải?

void f(int) 
void f(int, int) 
void f(int, float) 

Làm thế nào để biên dịch nó, vì vậy mà tôi có thể nhìn thấy đầu ra đã bị đọc sai? Cái gì như:

void f(int) should show: [email protected]@[email protected](int) 

Giống như ví dụ, để xem kết quả xử lý trước chúng tôi sử dụng -E, lắp ráp đầu ra -s, nó là gì cho tên đọc sai kết quả?

Tái bút: Nền tảng là Linux

EDIT:

Và bằng những câu trả lời ở đây chúng tôi đi:

void func(int); 
void func(int, int); 
void func(void); 
void func(char); 

[[email protected] ~]# cat a.map | grep func 
       0x0804881a    _Z4funcc 
       0x08048790    _Z4funcv 
       0x080487be    _Z4funcii 
       0x080487ec    _Z4funci 
+1

Gọi chức năng mà không thực hiện chúng, các mối liên kết sẽ được loại, đủ để cho bạn biết tên đọc sai trong thông báo lỗi. :) –

Trả lời

10

Đối với GCC hãy thử sử dụng:

-Xlinker -Map=output.map 

http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

Điều này sẽ tạo ra một file bản đồ đó sẽ có tất cả những cái tên biểu tượng đọc sai.

Và đối với MSVC:

http://msdn.microsoft.com/en-us/library/k7xkk3e2(v=vs.80).aspx

này sẽ tạo ra một cái gì đó như:

0002:00094190  [email protected]@@[email protected]@@Z 10148190 f i y:foo.obj 
+0

Câu trả lời hay. Cả bạn và chrisaycock đều phục vụ mục đích, nhưng kể từ khi tôi được hỏi từ quan điểm gcc, vì vậy bạn là người tôi nên chọn.Cảm ơn :-) – kingsmasher1

+0

@ kingsmasher1 Tôi tò mò là tại sao tôi không "phục vụ mục đích". –

0

Có một số tùy chọn trong trình biên dịch/liên kết của bạn để tạo tệp bản đồ. Trong tệp đó, bạn có thể thấy tên bị xé rách của tất cả các hàm và phương thức.

+0

Nó là trình biên dịch cụ thể. Tôi có thể đã nói nên, nhưng tôi có nghĩa là có thực sự là thiết bị chuyển mạch như thế. Giống như cuối cùng đã được chỉ ra bởi câu trả lời của paulm. Một mapfile thực sự là con đường để đi. –

+0

Vâng, ý tôi là người hỏi đã nói đó là trình biên dịch của nó (gcc). Câu trả lời của bạn không phải là không chính xác trong chính nó, nhưng wrt cho câu hỏi, nó không phải là một câu trả lời thực sự cho điều đó. Hy vọng bạn hiểu ý tôi là gì; bài đăng của bạn phải là một nhận xét thay thế :) –

3

Tùy chọn -S yêu cầu GCC chỉ biên dịch nhưng không lắp ráp một hàm. Ví dụ, nó sẽ xuất ra văn bản lắp ráp có thể đọc được bằng con người, trong đó bạn có thể thấy các tên hàm. Hãy chạy qua số c++filt để bạn có thể liên kết tên bị cắt xén với những tên chưa được xử lý.

+0

Khi bạn đã có trình biên dịch, 'C++ filt myProg.s | diff - myProg.s' nên cung cấp thông tin bạn cần. –

+0

Câu trả lời của bạn cũng phục vụ cho mục đích này, và cảm ơn vì đã cho chúng tôi biết một cách khác để đạt được cùng một mục tiêu, nhưng tôi chỉ có thể chấp nhận 1 câu trả lời cùng một lúc, và kể từ khi tôi hỏi câu hỏi từ góc độ gcc, một là một trận đấu gần hơn. – kingsmasher1

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