2015-11-11 87 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