2015-11-11 86 views
0

我有一個非常小的程序,我希望能夠在多個平臺上編譯。有些平臺在signal.h中提供sys_signame,但其他平臺不提供,我需要提供替代方案。使用#define/#ifndef不是一個選項:這些是平臺標題,不是我的,並且似乎沒有任何特定的#define行與多個平臺上存在的sys_signame相對應。檢查變量的存在

我不想爲每個平臺添加特殊情況。這是一個非常小的程序,只有少數人會看到,而且它不會用於任何生產環境。我還不知道它將使用什麼操作系統。我不值得花時間對其進行徹底測試。我會爲更重要的節目保存那些東西。

如何測試全局變量的存在性,如sys_signame

+0

你的問題聽起來像XY問題的一個實例。你想用'sys_signame'做什麼? – fuz

+0

如果變量不存在,如何編譯代碼? –

+0

@FUZxxl檢索信號名稱並以簡短形式將其顯示給用戶。 – Zenexer

回答

2

我看到它的方式 - 您需要創建一個可在所有平臺上工作的備用陣列,具體取決於您準備處理的信號列表。

const char* my_sys_signame[] = { NULL, "HUP", "INT", ... "USR2" }; 


最後,如果你必須檢查sys_signame的存在,你唯一的選擇就是做這樣的事情:

#ifdef NSIG 
// have sys_signame 
#else 
// does not have sys_signame 
#endif 
+0

請注意'strsignal(sig)'爲'sig'輸出一個描述性字符串,而不是信號名稱本身。例如,'strsignal(SIGKILL)'通常返回類似''殺死''的東西'。 – fuz

+0

謝謝@FUZxxl,刪除了這一行,因爲它是不正確的,就像你指出的那樣。 –

+0

我看過的所有平臺都定義了'NSIG',但有些沒有定義'sys_signame'。例如,Linux沒有'sys_signame',但是Mac OS X有;都有'NSIG'。 BSD缺乏據說'strsignal',但我沒有測試過。不幸的是,不同平臺的信號數字並不相同,但我可以使用宏和'#ifdef'解決這個問題。 – Zenexer