(Disclamer:這是作業)全局靜態int在自我調用模塊中
我正在創建一個shell程序,我們稱之爲fancysh。我正在嘗試將PATH(和其他env vars)功能添加到我的shell中,到目前爲止都很好。我天真的做法是將所有這些變量作爲靜態變量存儲在fancysh.c中。但是現在我試圖實現保存shell的當前「深度」的環境變量SHLVL。例如,我可以在fancysh的第一個實例中運行,並且SHLVL應該讀取1,在再次調用fancysh時,SHLVL應該增加(並且在shell退出時遞減)。
我已經試過......
fancysh.h
#ifndef FANCYSH_H
#define FANCYSH_H
extern int SHLVL;
#endif
fancysh.c
#include "fancysh.h"
int SHLVL;
int main(){
/* some fancy code to determine if SHLVL is initalized */
/* if not init to 0 */
SHLVL ++;
printf("%d\n", SHLVL);
/* Test Code Only */
int pid = fork();
if(pid == 0 && SHLVL < 10)
exec("fancysh");
wait();
/* Test Code Only */
/* shell code */
SHLVL--;
printf("%d\n", SHLVL);
exit(0);
}
那麼我該如何去實現花哨的代碼來確定SHLVL是否被初始化?我對使用#ifdef
和#define
的組合有一些想法,但我不是100%確定如何做到這一點。
注意:混淆通常是一個非常糟糕的主意。在這裏你混淆了關鍵字'extern'。你爲什麼這樣做?在可預見的將來,這是不太可能改變的。 – Olaf
這樣做是爲了讓SHLVL只在外部申報一次。 –
同一個變量的多個'extern'聲明不是固有的問題,既不在相同的翻譯單元中,也不在相同的程序或庫中提供不同的翻譯單元。 –