Có khả năng nào có thể đánh giá hàm tĩnh bên ngoài phạm vi tệp. ?Truy cập chức năng tĩnh trong các tệp khác
Trả lời
Điều đó phụ thuộc vào ý bạn bằng cách "truy cập". Tất nhiên, chức năng không thể được gọi bằng tên trong bất kỳ tập tin nào khác vì nó là static
trong một tệp khác, nhưng bạn có một con trỏ hàm cho nó.
$ cat f1.c
/* static */
static int number(void)
{
return 42;
}
/* "global" pointer */
int (*pf)(void);
void initialize(void)
{
pf = number;
}
$ cat f2.c
#include <stdio.h>
extern int (*pf)(void);
extern void initialize(void);
int main(void)
{
initialize();
printf("%d\n", pf());
return 0;
}
$ gcc -ansi -pedantic -W -Wall f1.c f2.c
$ ./a.out
42
Không, trừ khi có lỗi trong trình biên dịch. Thông thường, mã chức năng tĩnh không được gắn thẻ với tên được sử dụng để xuất hàm trong tệp đối tượng, vì vậy nó không được hiển thị cho trình liên kết và nó không thể liên kết đến nó.
Điều này tất nhiên chỉ áp dụng khi gọi hàm theo tên. Mã khác trong cùng một tệp có thể lấy địa chỉ hàm và chuyển nó vào một hàm không tĩnh trong tệp khác và sau đó hàm từ tệp khác có thể gọi hàm tĩnh của bạn.
Theo tiêu chuẩn, không thể truy cập chức năng tĩnh bên ngoài phạm vi của tệp theo tên do liên kết nội bộ. Tên của nó không được xuất và không được cung cấp cho trình liên kết. Tuy nhiên, nó vẫn có thể được truy cập và gọi bằng con trỏ hàm, giống như bất kỳ hàm nào khác.
Nó có thể được gọi từ bên ngoài phạm vi thông qua con trỏ hàm.
Ví dụ, nếu bạn có:
static int transform(int x)
{
return x * 2;
}
typedef int (*FUNC_PTR)(int);
FUNC_PTR get_pointer(void)
{
return transform;
}
sau đó một chức năng nằm ngoài phạm vi có thể gọi get_pointer() và sử dụng con trỏ hàm trở lại gọi biến đổi.
Tôi nghĩ rằng nên là "int (* get_pointer (int)) (void)". – paxdiablo
@paxdiablo và @caf - cảm ơn bạn. –
Không, mục đích của từ khóa tĩnh là giới hạn phạm vi của tên hàm thành tệp.
Không thể truy cập bên ngoài tệp theo tên của nó. Tuy nhiên, bạn cũng có thể gán cho nó chức năng con trỏ và sử dụng nó bất cứ nơi nào bạn muốn.
Chỉ với mẹo vặt. Chức năng thường không hiển thị với trình liên kết để nó không cho phép bạn thực hiện nó.
Nhưng, nếu bạn cung cấp một chức năng bên trong đơn vị biên soạn cùng (như chức năng tĩnh) mà trả về địa chỉ của hàm:
Trong main.c
:
#inclde <stdio.h>
int (*getGet7(void))(void);
int main (void) {
int (*fn)(void) = getGet7();
printf ("Result is: %d\n", fn());
return 0;
}
Trong hidden.c
:
static int get7 (void) {
return 7;
}
int (*getGet7(void)) (void) {
return get7;
}
Điều này sẽ dẫn đến chức năng tĩnh get7
đang được gọi.
pax> gcc -o demo main.c hidden.c ; ./demo
Result is: 7
"Đã truy cập"? Nó phụ thuộc vào ý của bạn bằng thuật ngữ này. Tôi giả sử khi bạn nói "hàm tĩnh", bạn đang nói về hàm độc lập được khai báo static
(tức là được khai báo với liên kết bên trong) trái ngược với hàm thành viên lớp tĩnh trong C++, vì hàm sau là obviosly và dễ truy cập từ mọi nơi.
Hiện tại, một hàm độc lập được khai báo static
có liên kết nội bộ. Không thể là được liên kết với từ bất kỳ đơn vị dịch nào khác.Hoặc, đặt nó khác đi, nó không thể được gọi là theo tên từ bất kỳ đơn vị dịch nào khác. Nếu đó là những gì bạn có nghĩa là "truy cập từ bên ngoài phạm vi tập tin", sau đó không, nó không thể được thực hiện. Tuy nhiên, nếu các đơn vị dịch khác bằng cách nào đó có một con trỏ đến hàm đó (nghĩa là nếu bạn bằng cách nào đó cho phép con trỏ đó "rò rỉ" vào thế giới bên ngoài), thì ai cũng có thể gọi hàm đó bằng cách thực hiện cuộc gọi không trực tiếp và do đó "Truy cập nó. Ví dụ, nếu bạn khai báo
static void foo_static(void) {
}
extern void (*foo_ptr)(void) = foo_static;
sau đó trong bất kỳ đơn vị dịch thuật khác, người dùng sẽ có thể làm
extern void (*foo_ptr)(void);
foo_ptr();
và cuộc gọi sẽ được chuyển tới chức năng foo_static
của bạn. Tôi không biết liệu loại quyền truy cập đó có đủ điều kiện để "truy cập" trong câu hỏi của bạn hay không.
- 1. Truy cập biến tin từ chức năng tĩnh trong php
- 2. C++ chức năng thành viên truy cập biến tĩnh riêng?
- 3. Có thể truy cập các chức năng xuất mô-đun khác trong cùng một tệp không?
- 4. Truy cập chức năng thành viên của một tệp .cpp khác trong cùng một tệp nguồn?
- 5. Biến truy cập từ phạm vi chức năng khác?
- 6. Không thể sử dụng flask.g để truy cập các biến trong các chức năng khác
- 7. Truy cập các biến tĩnh
- 8. Truy cập chức năng C++ từ QML
- 9. các chức năng mẫu tĩnh trong một lớp
- 10. Truy cập các biến từ một tệp CoffeeScript khác?
- 11. nguyên mẫu cho các chức năng 'tĩnh'
- 12. postgresql 9.1 - bảng truy cập thông qua các chức năng
- 13. Tệp tĩnh trong (Java) App Engine không thể truy cập
- 14. Chức năng tổng hợp trong truy vấn cập nhật SQL?
- 15. Truy cập hàng/cột trong chức năng 'áp dụng'
- 16. Làm cách nào để truy cập chức năng bên trong một chức năng?
- 17. LoadControl trong chức năng tĩnh/chia sẻ
- 18. Nhà xây dựng tĩnh có thể giảm hiệu năng truy cập các phương pháp tĩnh không?
- 19. Cách truy cập chức năng trong không gian tên
- 20. Phương pháp Const truy cập các biến tĩnh
- 21. Truy cập chức năng rung trong Windows 8 WinRT?
- 22. Symfony2 - Truy cập chức năng kho lưu trữ trong Entity
- 23. Py2exe: Nhúng các tệp tĩnh trong tệp exe và truy cập chúng
- 24. Làm cách nào để truy cập biến tĩnh từ tệp khác trong C?
- 25. Truy cập các phương thức riêng tư từ các chức năng mô-đun trong Ruby
- 26. Chức năng thành viên tĩnh
- 27. Truy cập các thuộc tính tĩnh trong Sencha Touch
- 28. Truy cập chức năng băm chuỗi tích hợp của Lua
- 29. Chức năng đệ quy với biến tĩnh
- 30. chức năng tĩnh gọi phi tĩnh trong C++
Nếu bạn đặt hàm vào tệp tiêu đề. Sau đó sẽ có một phiên bản tĩnh trong mỗi đơn vị biên dịch. –