1樓:趙者也
典型的AOP操作。比較有共識的實現方式是函式巢狀來實現,就是外函式做你說的那些額外功能,內函式實現主要的計算邏輯。
當然c的話還可以用巨集等奇技淫巧。
但是你說簡單的話那估計不行
2樓:蘭威舉
gcc 可以用 attribute(__cleanup__(fn)) int var; 實現。這個類似於給 var 加了個析構函式 fn。
3樓:1573629731983461
需求:函式的輸入引數列表和返回引數型別可能五花八門,要對所有的函式進行這種「包裹」。乙個乙個去匹配可能比較麻煩,沒想到什麼好的辦法能夠「自動」一點實現。
一#if defined(__linux)
# define hook(ret,func,post_hook,...) (; ret;})
#else
# define hook(ret,func,post_hook,...) (ret = func(__VA_ARGS__), post_hook, ret)
#endif
int f1()
int f2(int a)
int main()
二#define hook(func,post_hook,...) post_hook(func(__VA_ARGS__));
int f1()
int f2(int a)
int post_hook(int r)
int main()
三#include
int f1()
int f2(int a)
#define hook(ret, fn, post) static inline ret post_##fn(ret r)
hook(int, f1, );
hook(int, f2, );
#define f1(...) post_f1(f1(__VA_ARGS__))
#define f2(...) post_f2(f2(__VA_ARGS__))
int main()
四#include
int f1()
int f2(int a)
#define hook(rettype, func, params, args, pre, post) \
static inline rettype func##_hook paramsrettype r; pre; r = func args; post; return r; \
}hook(int, f1printf("f1 pre\n"); }, );
hook(int, f2, (int a), (a),
, );
#define f1 f1_hook
#define f2 f2_hook
int main()
4樓:陳殼子
#include
void
__cyg_profile_func_enter
()__attribute__
((no_instrument_function
));void
__cyg_profile_func_exit
()__attribute__
((no_instrument_function
));int
f1()
intf2
()int
f3()
void
__cyg_profile_func_enter
(void
*this_func
,void
*call_site
)void
__cyg_profile_func_exit
(void
*this_func
,void
*call_site
)elseif(
this_func==&
(*f2))
elseif(
this_func==&
(*f3))
printf
("%s exited, after function: %p\n"
,__FUNCTION__
,this_func);}
int__attribute__
((no_instrument_function
))main
()參考:
Instrumentation Options (Using the GNU Compiler Collection (GCC))
gcc的編譯選項 -finstrument-functions 會在你函式的開始和結束call兩個特殊函式:
void __cyg_profile_func_enter
void __cyg_profile_func_exit
void __cyg_profile_func_exit就是你要的。
假設這個檔名是test.c,編譯時 gcc -finstrument-functions test.c 就可以了。
因為__cyg_profile_func_exit的引數是函式指標,要實現記錄/根據不同函式做不同操作,有大於2種方式,我提乙個思路。你可以維護乙個函式名=>函式指標的表,在__cyg_profile_func_exit中通過這個錶用if做不同操作。如果所有函式的操作都相同,比如要記錄execution time/times,那你可以另寫乙個函式呼叫,直接根據函式指標記錄。
然後用add2line通過指標位址查函式名來檢查。
5樓:積石息土
我沒有完全理解你的意圖。我隱約覺得你需要的可能是(如果不是此需求的話,自動忽略此回答吧):
void
func1
();//函式宣告
intfunc2
();//函式宣告
#ifdef DEBUG
#define func1() dowhile(0)intfunc2_return
;#define func2() ()
#endif
6樓:lambda
可以思考,不一定好辦。
這另外一段命令,需要不需要訪問函式內的區域性變數呢?return後會被編譯器加入退棧和跳轉的指令,完成退棧後臨時變數的值就被覆蓋了。
另外要執行的這段命令如果要呼叫其他函式,會把事情搞更複雜。
老標準的C語言這樣定義函式方法嗎?
這是 ANSI C 出現之前的事了,後來大家發現,這種寫法在宣告函式時無法檢查引數型別,於是就在 ANSI C 中改進了。但是現在好像還有一些 UNIX 的系統原始碼,為了穩定而沒有做改動。在 K R 第二版附錄裡有講。 SuperSodaSea 參考標準 C11 ISO IEC 9899 2011...
c中有沒有區域性函式?
已登出 我理解的區域性函式是指在乙個函式內部定義的函式,那麼這樣的函式在C語言裡應該是沒有的,如果你說的區域性函式是指只能在乙個檔案中被呼叫的函式,那麼static函式在C語言是區域性函式。在C 11等更新的標準中,可以在函式內部定義lamda表示式,來實現在乙個函式內部定義另乙個函式並呼叫的功能。...
c語言中,如果main函式的末尾沒有return語句將會有什麼影響
日天山君 首先,如果是微控制器這種沒有作業系統的,直接void main 沒有引數也不需要返回值。然後才輪到在作業系統上執行的C語言程式,在int main最後寫乙個return,其目的是為了將執行結果狀態告訴作業系統 或父程序 是執行成功呢還是不成功。然後可以根據執行結果狀態採取不同的方案,是結束...