[英]C++ - global pointer to function
為什么這樣做有效? 我認為全局數據是在編譯時“初始化”的(編譯器以obj文件格式將.global節保存為空字節,因此當該節加載到內存中時,它會初始化為null)。 如果編譯器在運行時不知道函數在內存中的位置,那么如何初始化指向函數地址的指針呢?
#include <iostream>
void vypis();
int neco;
int * bla = &neco;
void (*vypis_ptr)() = vypis;
int main(int argc, const char * argv[])
{
}
void vypis() {
}
我刪除了iostream
的冗余包含,以便您的源實際編譯為C,然后在我的系統上將其編譯為可執行文件vypis。 這是我發現的:
$ nm vypis | fgrep vypis
00000000004004d0 T vypis
0000000000600888 D vypis_ptr
因此,函數vypis
在“文本”部分是全局的,而函數指針vypis_ptr
在“數據”部分是全局的。
數據部分中的對象具有存儲在可執行文件中的值,我可以通過使用objdump
轉儲數據部分來讀取vypis_ptr
的內容。
$ objdump -d -j .data vypis
vypis: file format elf64-x86-64
Disassembly of section .data:
0000000000600878 <__data_start>:
...
0000000000600880 <__dso_handle>:
...
0000000000600888 <vypis_ptr>:
600888: d0 04 40 00 00 00 00 00 ..@.....
0000000000600890 <bla>:
600890: a8 08 60 00 00 00 00 00 ..`.....
在這里,我們可以看到,值4004d0
存儲在vypis_ptr
但這正是的位置vypis
中顯示的輸出nm
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.