Ít nhất với GCC và glibc, biểu tượng cho các hàm C chuẩn là yếu và do đó bạn có thể ghi đè lên chúng. Ví dụ,
strcpy.c:
#include <string.h>
#include <stdio.h>
char * strcpy(char *dst, const char *src)
{
char *d = dst;
while (*src) {
*d = *src;
d++;
src++;
}
printf("Called my strcpy()\n");
return (dst);
}
int main(void)
{
char foo[10];
strcpy(foo, "hello");
puts(foo);
return 0;
}
Và xây dựng nó như thế này:
gcc -fno-builtin -o strcpy strcpy.c
và sau đó:
$ ./strcpy
Called my strcpy()
hello
Lưu ý tầm quan trọng của -fno-builtin
đây. Nếu bạn không sử dụng điều này, GCC sẽ thay thế cuộc gọi strcpy()
thành hàm dựng sẵn, trong đó GCC có một số.
Tôi không chắc liệu điều này có hoạt động với các trình biên dịch/nền tảng khác không.
Tại sao bạn muốn làm điều này? Điều gì có thể * có thể * là điểm? –
Có thực sự đáng giá không? Bạn sẽ phải chỉnh sửa tệp tiêu đề string.h, vị trí của nó phụ thuộc vào hệ thống và môi trường bạn đang sử dụng. Nhưng tôi nghĩ bạn sẽ tốt hơn khi viết một hàm riêng biệt. – Shredderroy
@CodyGray, tôi đoán, nhìn vào câu trả lời của FatalError [http://stackoverflow.com/questions/9107259/how-to-replace-c-standard-library-functioin#9107319), bạn có thể thay thế mọi cuộc gọi trong một thực thi của riêng bạn mà in gỡ lỗi? Hoặc một cái gì đó như thế, tôi đoán vậy. Có lẽ không phải là thực hành tốt mặc dù. Bạn nên viết một hàm mới với một tên khác và thay đổi tất cả các cuộc gọi. – Anthony