Tôi thích chức năng liên kết của GNU để bao bọc các chức năng rất nhiều. Tôi thường sử dụng mô hình đó, ví dụ: các hàm gọi không xác định như rand(). Hãy xem xét ví dụ sau đây mà tôi muốn viết một bài kiểm tra đơn vị cho giveMeANumber:Đóng gói các hàm C++ với trình liên kết GNU
//number.cpp
int giveMeANumber() {
return rand() % 6 + 1;
}
tôi có thể quấn gọi rand với GNU quấn chức năng liên kết như thế này:
//test.cpp
extern "C" int __wrap_rand(void) {
return 4;
}
void unitTest() {
assert giveMeANumber() == 5;
}
$ g++ test.cpp -o test number.o -Xlinker --wrap=rand
Có cách nào để làm tương tự với các hàm C++ bình thường? Sau đây không làm việc, tôi đoán đó là vì mangling tên. Nhưng ngay cả khi tôi thử nó với tên bị xé nó không hoạt động.
//number.cpp
int foo() {
//some complex calculations I would like to mock
}
int giveMeANumber() {
return foo() % 6 + 1;
}
//test.cpp
extern "C" int __wrap_foo(void) {
return 4;
}
$ g++ test.cpp -o test number.o -Xlinker --wrap=foo
Bất kỳ ý tưởng nào?
Thực ra, rand là hàm xác định. Nó trả về một chuỗi số giả ngẫu nhiên. Các cuộc gọi rand sẽ trả về cùng một chuỗi các số cho bất kỳ hạt giống nào được sử dụng với srand. – TJD
Được rồi, bravo, đó là sự thật. Nhưng để giữ ví dụ ngắn và dễ đọc, tôi không sử dụng hạt giống. – Mike
Bạn cần đổi tên '__wrap_foo' thành' getRandomNumber'. (http://xkcd.com/221/) –