#include<stdio.h>
static int a=5;
main()
{
static int a=15;
printf("%d\n",a);
}
那么,两个å˜é‡a
如何å˜å‚¨åœ¨å†…部å˜å‚¨å™¨ä¸ï¼Ÿ
具有相åŒå˜é‡å的全局å˜é‡å’Œå±€éƒ¨å˜é‡å¦‚何å˜å‚¨åœ¨å†…å˜ä¸ï¼Ÿ
ç”案 0 :(得分:1)
#include<stdio.h>
static int a=5;
int main()
{
printf("%p\n",(void *)&a);
static int a=15;
printf("%p\n",(void *)&a);
return 0;
}
上层程åºçš„输出是
0x564e6b67a030
0x564e6b67a034
å› æ¤ï¼Œæ‚¨å¯ä»¥çœ‹åˆ°ä¸¤è€…都å˜å‚¨åœ¨ä¸åŒçš„地å€ä¸ã€‚å› ä¸ºä¸€ä¸ªæ˜¯å…¨å±€å˜é‡è€Œå¦ä¸€ä¸ªæ˜¯æœ¬åœ°å˜é‡ã€‚
ç”案 1 :(得分:1)
这些å称仅供人类读者感兴趣,编译器/链接器将该代ç 转æ¢ä¸ºæœºå™¨å¯æ‰§è¡Œä»£ç ã€‚æœ€ç»ˆç›®æ ‡ä»£ç 将这些解æžä¸ºåœ°å€ï¼Œå称ä¸å†å˜åœ¨ã€‚
编译器以åŒæ ·çš„æ–¹å¼åŒºåˆ†è¿™äº› - 按范围;当åŒä¸€å称空间ä¸çš„两个相åŒç¬¦å·åŒæ—¶åœ¨èŒƒå›´å†…时,范围最大的符å·æ˜¯å¯è§çš„(å³å¯ä»¥é€šè¿‡å称访问)。
对于具有外部链接的符å·ï¼ˆåœ¨æ‚¨çš„示例ä¸é™¤äº†main
之外没有其他符å·ï¼‰ï¼Œç¼–译器会ä¿ç•™ç¬¦å·å称以解æžå•ç‹¬ç¼–译的模å—之间的链接。在完全链接的å¯æ‰§è¡Œæ–‡ä»¶ä¸ï¼Œç¬¦å·å称ä¸å†å˜åœ¨ï¼ˆè°ƒè¯•æž„建符å·å…ƒæ•°æ®é™¤å¤–)。
ç”案 2 :(得分:0)
这个滑稽的ç”案是它们å˜æ”¾åœ¨ä¸åŒçš„地方。
请记ä½ï¼Œå˜é‡çš„å称ä¸ä¼šï¼ˆé€šå¸¸ï¼‰æž„æˆç¼–译程åºçš„ä¸€éƒ¨åˆ†ï¼Œå› æ¤ç¼–译器åªéµå¾ªå˜é‡ shadowing çš„å¸¸è§„è§„åˆ™ã€‚æ‰€ä»¥åœ¨ä½ çš„æƒ…å†µä¸‹ä½ çš„print
函数(顺便说一下,这ä¸æ˜¯æ ‡å‡†çš„C函数 - ä½ çš„æ„æ€æ˜¯printf
å—?)输出a
ä¸å£°æ˜Žçš„main
。您使用相åŒåç§°çš„äº‹å®žæ ¹æœ¬ä¸ä¼šæ‰“扰编译器。
最åŽï¼Œåœ¨a
main
é‡åˆ°å…¶ä»–声明时,Cæ— æ³•è®¿é—®å…¨å±€ä½œç”¨åŸŸstatic
。extern
。 (这ä¸æ˜¯é™æ€çš„,您å¯ä»¥ä½¿ç”¨python setup.py install
。)请å‚阅How can I access a shadowed global variable in C?