C語言有沒有簡單的方法,能讓函式中執行return之後,再次再執行另外一段命令?

時間 2022-01-06 11:01:20

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,其目的是為了將執行結果狀態告訴作業系統 或父程序 是執行成功呢還是不成功。然後可以根據執行結果狀態採取不同的方案,是結束...