[問題] main 前執行之函式?(已解決)
這是在 vc 2008 trace 時, 不小心發現的問題,
trace 時, 由 F11 trace 一些 source code ,
雖看得很吃力, 但仍硬看下去, 看到後來有點懷疑,
應該是有東西要在進入 main 之前先執行過才對,
想請教, vc 是否有方法, 能在進入 main 前, 先執行過某個函式 ?
謝謝各位。
問題已解決, 下述供參考。(還真是有趣的問題啊!!)
---
一開始一直試都不成功,原因在於 Visual C++ .c 不支援 C99,
改 .cpp 之後就過了,一開始查 msdn ,查到這份網頁
http://msdn.microsoft.com/en-us/library/bb918180.aspx
看完第一個 global variable initialize 後,裡面說明提到
According to the C/C++ standard, func() must be called before main() is
executed. But who calls it?
( M$ 真是自打嘴巴,明明說標準可以這麼做,偏偏 .c 連這點都不支援)
這部份可能查 C99 會有更多的說明, 但 M$ 這份我覺得寫得還不錯。
基於上述,第一份 code 試作
// only for cpp
#include <stdio.h>
#include <stdlib.h>
int* Alloc10(){ return (int*)malloc(sizeof(int)*10);}
int *p = Alloc10();
int main()
{
int i;
for(i=0; i!=10; ++i) p[i]=i;
for(i=0; i!=10; ++i) printf("%d ", p[i]);
free(p);
return 0;
}
----
以下東西,對 Visual C++ 不感興趣可跳過。
在剛上面那個連結裡面,原文提及了 But who calls it?
又有幾個關鍵字 : .CRT$XCU .CRT$XCA .CRT$XCZ ,
最後連到這個網站 http://zh-cn.w3support.net/index.php?db=so&id=728939
原來是在搞 #pragma section, 有興趣連進去看 section 在幹嘛
http://msdn.microsoft.com/en-us/library/sf9b18xk(v=vs.80).aspx
由於嫌對岸網站寫得太... 文言文,想說自己把能改的都改看看
#include <stdio.h>
#pragma section(".CRT$XIC1",long,read)
// ==========================================
void before_main(void); /* function declare */
typedef void ( *pfpuc)(void); /* function pointer */
#define _CRTALLOC(x) __declspec(allocate(x))
/* set function before main */
_CRTALLOC(".CRT$XIC1") static pfpuc pinit1 = before_main;
// ==========================================
int z;
void before_main(void)
{
z = 100;
}
int main(void)
{
printf("Some code before main!\n");
printf("z = %d\n", z);
printf("End!\n");
return 0;
}
嗯, 一切都正常執行,只是不確定有沒有拿掉不該拿的就是了。
---
關於 debug 部份,可能也是我技巧沒很好 (最近 VS 2008 Debugger 常被我搞掛要重開)
但若照 MSDN 上對於 section header 說明,
global variable initialize 之部份應該完全 trace 不到,
以上述的 *p = Alloc10(); 而言,按下 F11 就直接進到 main 了,
完全沒機會看到那段 ( Debug 從 main 開始 trace 也算合理吧 ) 。
而用 #pragma section, 那又更特別了,按下 F11 ,程式直接結束...
至於 e 大提到 dll 的話, 嗯, 目前我也不會追, 連導出函式名都不會。
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.78.41
推
09/03 03:37, , 1F
09/03 03:37, 1F
→
09/03 03:38, , 2F
09/03 03:38, 2F
→
09/03 03:39, , 3F
09/03 03:39, 3F
推
09/03 03:47, , 4F
09/03 03:47, 4F
→
09/03 03:59, , 5F
09/03 03:59, 5F
→
09/03 03:59, , 6F
09/03 03:59, 6F
→
09/03 04:00, , 7F
09/03 04:00, 7F
推
09/03 04:09, , 8F
09/03 04:09, 8F
※ 編輯: tropical72 來自: 180.177.78.41 (09/03 05:03)
推
09/03 05:02, , 9F
09/03 05:02, 9F
→
09/03 05:04, , 10F
09/03 05:04, 10F
→
09/03 05:05, , 11F
09/03 05:05, 11F
推
09/03 05:06, , 12F
09/03 05:06, 12F
→
09/03 05:07, , 13F
09/03 05:07, 13F
→
09/03 05:08, , 14F
09/03 05:08, 14F
→
09/03 05:08, , 15F
09/03 05:08, 15F
→
09/03 05:09, , 16F
09/03 05:09, 16F
→
09/03 05:10, , 17F
09/03 05:10, 17F
→
09/03 05:11, , 18F
09/03 05:11, 18F
→
09/03 05:12, , 19F
09/03 05:12, 19F
→
09/03 05:13, , 20F
09/03 05:13, 20F
推
09/03 05:20, , 21F
09/03 05:20, 21F
→
09/03 05:21, , 22F
09/03 05:21, 22F
→
09/03 05:22, , 23F
09/03 05:22, 23F
→
09/03 05:22, , 24F
09/03 05:22, 24F
→
09/03 05:23, , 25F
09/03 05:23, 25F
→
09/03 05:26, , 26F
09/03 05:26, 26F
推
09/03 21:23, , 27F
09/03 21:23, 27F
→
09/03 22:02, , 28F
09/03 22:02, 28F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 3 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章