Home > database >  How to pass a string as a macro?
How to pass a string as a macro?

Time:02-22

There are many functions in the C libraries that require users to input with macros. I wonder, if I have an array of strings, with contents of macros, like so:

char s[][3] = {"SIGINT", "SIGKILL", "SIGSTOP"};

How can I pass these strings as macros? (Like so:)

signal(s[0], do_something);

with do_something is a function pointer.

(and yes, technically I can pass ints in this case, but... hypothetically, ya know?)

EDIT: As @RemyLebeau and SGeorgiades point out, the "SIGINT",... are aliases for integer consts, and therefore can be stored in an int array, like so:

int s[3] = {SIGINT, SIGKILL, SIGSTOP};

CodePudding user response:

Perhaps what you want instead is:

int s[3] = { SIGINT, SIGKILL, SIGSTOP };

signal(s[0], do_something);

CodePudding user response:

Although SGeorgiades and Remy Lebeau already gave you the answer, here is something that I've used in the past to allow conversion and pretty printing of signal numbers and names:

#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;
}
  •  Tags:  
  • c
  • Related