C 庫中有許多函式需要用戶使用宏進行輸入。我想知道,如果我有一個包含宏內容的字串陣列,如下所示:
char s[][3] = {"SIGINT", "SIGKILL", "SIGSTOP"};
如何將這些字串作為宏傳遞?(就像這樣:)
signal(s[0], do_something);
withdo_something是一個函式指標。
(是的,從技術上講,在這種情況下我可以傳遞整數,但是......假設,你知道嗎?)
編輯:正如@RemyLebeau 和 SGeorgiades 指出的那樣,“SIGINT”,... 是整數常量的別名,因此可以存盤在 int 陣列中,如下所示:
int s[3] = {SIGINT, SIGKILL, SIGSTOP};
uj5u.com熱心網友回復:
盡管 SGeorgiades 和 Remy Lebeau 已經給了你答案,這里是我過去用來轉換和漂亮列印信號編號和名稱的東西:
#include <stdio.h>
#include <signal.h>
#include <string.h>
struct sigfun {
int signo;
const char *signame;
};
#define SIGFUN(_sig) \
{ \
.signo = _sig, \
.signame = #_sig \
}
struct sigfun siglist[] = {
SIGFUN(SIGINT),
SIGFUN(SIGKILL),
SIGFUN(SIGSTOP),
// ...
{ .signo = 0, .signame = NULL }
};
#define SIGFORALL(_sig) \
_sig = siglist; _sig->signame != NULL; _sig
int
signame_to_signo(const char *signame)
{
struct sigfun *sig;
for (SIGFORALL(sig)) {
if (strcmp(sig->signame,signame) == 0)
break;
}
return sig->signo;
}
const char *
signo_to_signame(int signo)
{
struct sigfun *sig;
for (SIGFORALL(sig)) {
if (signo == sig->signo)
break;
}
return sig->signame;
}
更新:
為什么不
for投入SIGFORALL?– 斯坦尼斯
由于幾個原因...
我以前做過(例如):
#define SIGFORALL(_sig) \
for (_sig = siglist; _sig->signame != 0; _sig)
SIGFORALL(sig) {
// do stuff
}
- 這往往會混淆某些決議代碼而不通過前處理器運行代碼的 IDE 和/或工具。
- 程式員也更難快速(不消化宏)跳過它。
- 他們看不到 a
for并且很難弄清楚是什么SIGFORALL(sig) {。 if宏是、for或的包裝器while嗎?
和:
#define SIGFORALL(_sig) \
_sig = siglist; _sig->signame != 0; _sig
for (SIGFORALL(sig)) {
// do stuff
}
他們有更好的機會繼續圍繞該構造,因為他們可以理解(即跳過)for (...)[語法]而不必知道宏在做什么。也就是說,除非他們愿意,否則沒有人必須“深入”到宏中。
另一個原因是,如果沒有宏中的for,我們可以在for回圈的初始化和迭代運算式中添加額外的代碼。它更靈活。
例如,我使用了類似的宏進行鏈表遍歷,并想知道元素的索引/計數:
#define LLFORALL(_node) \
_node = nodelist; _node != NULL; _node = _node->next
int idx;
for (idx = 0, LLFORALL(node), idx) {
if (node->value == 5)
printf("found value at index %d\n",idx);
}
這沒有絕對的規則。歸根結底,這是一種 [個人] 風格偏好。
uj5u.com熱心網友回復:
也許您想要的是:
int s[3] = { SIGINT, SIGKILL, SIGSTOP };
signal(s[0], do_something);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/431185.html
標籤:C
