作者purpose (purpose)
看板C_and_CPP
標題Re: [問題] C的考題
時間Sun Nov 28 23:21:43 2010
※ 引述《jcwilliam (william)》之銘言:
: 話說原PO今天參加筆試,遇到一題,想請教版上各位先進
:
: 遇到的問題: (題意請描述清楚)
: 有一個 main method 如下:
: int main(){
: cout<<"Hello Everyone!!"<<endl;
: return 0;
: }
: 題目的問題是,如何在不更改main method 內容的前提下,
: 使得輸出的畫面如下:
: Hey, I am coming.
: Hello Everyone!!
: Good bye.
:
: 關於這題,小弟當時想破了頭也想不出該如何改寫?
: 不知各位先進能否提供正確解答...
: Thanks in advance.
:
:
:
用 Windows 的 DLL 機制也可以做到 (其他作業系統怎麼用我不知道...)
// filename: main.cpp
// compile with: cl.exe main.cpp
#include <iostream>
using namespace std;
#pragma comment(lib, "dll.lib")
extern "C" {
__declspec(dllimport) void foo(void);
}
void bar() {
foo();
}
int main() {
cout<<"Hello Everyone!!"<<endl;
return 0;
}
分隔線分隔線分隔線分隔線分隔線分隔線分隔線分隔線分隔線分隔線
/*
filename: dll.c
compile with: cl.exe dll.c /LD
Reference:
http://msdn.microsoft.com/en-us/library/ms682583.aspx (DLLMain)
*/
#include <windows.h>
#include <stdio.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
if (fdwReason == DLL_PROCESS_ATTACH) {
printf("Hey, I am coming.\n");
} else if (fdwReason == DLL_PROCESS_DETACH) {
printf("Good bye.\n");
}
return TRUE;
}
__declspec(dllexport) void foo(void) {
printf("foo()..\n");
}
執行結果如下
D:\Desktop>main.exe
Hey, I am coming.
Hello Everyone!!
Good bye.
D:\Desktop>
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.133.69
→ purpose:可以啊,s大沒寫,我都忘了還可以直接結束程式去解決 11/28 23:33
推 james732:沒仔細看還真沒發現一樓的梗 XDDD 11/28 23:36
推 elfkiller:一樓的方法真酷 11/28 23:40
→ villix:如果在一開始做一個class~建構式跑第一行~解構式跑第三行 11/28 23:42
→ villix:然後一開始就宣告~這樣算不算啊XD 11/28 23:43
→ purpose:OK,反正輸出一樣 11/28 23:49
→ anotherday:超酷的解 XD 11/28 23:49
→ purpose:setstate 還真的都沒用過,用慣 printf 了 11/29 00:11
CRT 實作原理 (在調用 main() 之前先呼叫 _cinit 與 _initterm 函數)
http://blog.csdn.net/peteryxk/archive/2005/01/31/275564.aspx
※ 編輯: purpose 來自: 124.8.133.69 (11/29 00:13)
推 loveme00835:p 大這招太難了... Orz 11/29 00:19
推 ledia:讓我聯想到以前玩 wargame 時用的 LD_PRELOAD 11/29 00:20
→ purpose:上面是微軟的說明,感覺更清楚 11/29 00:32
→ softwind:你把執行檔給我 echo "start";執行; echo "end" 這樣也行 11/29 00:37
推 tkhunter:可是一樓的方法不是有改main了嗎? 11/29 00:38
→ purpose:一樓的程式不改 main 也能跑,他測試的時候忘了刪 11/29 00:39
→ tkhunter:soga 11/29 00:41
→ loveme00835:他的 main 根本沒機會被呼叫阿 XD 11/29 00:42
推 villix:樓上~我輸了~ 11/29 01:53
推 softwind:上面那個code... 比較像是腦筋急轉彎版本 XD 11/29 02:30
→ loveflames:gcc可以重寫exit,至於main之前能重寫什麼就不知了 11/29 02:30
→ uranusjr:#define 的那個我有想到過, 不過後來想想還是別貼出來XD 11/29 03:21
→ final01:XD 酷喔 11/29 11:21
推 xatier:樓上超強!! 11/29 20:02
推 tomap41017:樓樓上XDDDDDDDDDDDD 11/29 20:19
推 Eric30:大推 michael 大,這個方法第一名真的XD 12/01 15:41
→ LoveCheer:michael大好聰明XDDDD 學習~ 12/06 22:39