phép nói rằng tôi có hai tập tin:Namespace và các thành viên lớp tĩnh liên kết
/**
* class.cpp
*/
#include <stdio.h>
class foo
{
private:
int func();
};
int foo::func(void)
{
printf("[%s:%d]: %s\n", __FILE__, __LINE__, __FUNCTION__);
return -1;
}
và
/**
* main.cpp
*/
#include <stdio.h>
namespace foo
{
int func(void);
}
int main(void)
{
int ret = foo::func();
printf("[%s:%d]: ret=%d\n", __FILE__, __LINE__, ret);
return 0;
}
biên soạn như sau:
g++ -o a.out main.cpp class.cpp
Có một đầu ra từ tập tin thực thi:
[class.cpp:15]: func
[main.cpp:14]: ret=-1
Và cuối cùng câu hỏi của tôi:
Tại sao mẫu mã này biên soạn mà không cần bất kỳ lỗi nào và chúng tôi có thể gọi tin phương pháp lớp foo?
Được biên dịch bằng gcc 4.6.3 nhưng không chỉ. Tôi biết rằng trình biên dịch không phân biệt hai ký hiệu (func chức năng từ namespace foo và chức năng riêng foo từ lớp foo). Output từ nm:
nm class.o
00000000 T _ZN3foo4funcEv
00000017 r _ZZN3foo4funcEvE12__FUNCTION__
U printf
nm main.o
U _ZN3foo4funcEv
00000000 T main
U printf
Tôi muốn hỏi liệu hành vi này là đúng hay không? IMHO điều này là không đúng hành vi và nó không phải là an toàn ở tất cả (phá vỡ đóng gói).
Tôi muốn đề cập rằng trình biên dịch từ studio hình ảnh 2008 không liên kết hai biểu tượng đó.
Ok, tôi hiểu mọi thứ nhưng câu hỏi là tại sao có hành vi như vậy của trình biên dịch gcc. Trình biên dịch Windows có thể phân biệt các ký hiệu này. Không gian tên và lớp học không giống nhau, tôi có sao không? Trình biên dịch nên biết tất cả sự khác biệt giữa một không gian tên và lớp, phải không? – pako
Trình biên dịch biết, nhưng trình liên kết thì không. Tuy nhiên, trình biên dịch chuyển đổi từng tệp thành một tệp đối tượng riêng biệt. Cách bạn định nghĩa hai tệp là chúng hoàn toàn tách biệt với trình biên dịch. Những gì VS làm là tốt, nhưng không bắt buộc phải làm. Do đó, không được thực hiện bởi gcc. Clang cũng biên dịch nó mà không phàn nàn bằng cách này. – meyumer
Tôi biết rằng trình biên dịch biết, nhưng những gì tôi có nghĩa là trình biên dịch tạo ra hoàn toàn các biểu tượng giống nhau cho các chức năng đó, ngay cả khi chúng hoàn toàn khác nhau. Vì vậy, có lẽ gcc nên làm tương tự như trình biên dịch VS? Nó có thể tránh được một số lỗi tiềm năng. – pako