为动态获取动态定义

时间:2014-11-28 10:01:17

标签: c error-handling macros

在下面的代码中,我想使用宏CALL_MSG()为errors_manager函数使用预定义消息。 但是当我使用变量时,我无法得到变量的内容!

err = ILLOPS = 1;
CALL_MSG(err)
error: ‘MSG_err’ undeclared (first use in this function)

但是当我使用完全有效的整数时:/

ft_putstr(CALL_MSG(err));
print: illegal option -- 

我如何为我的消息制作类似的系统(如果可能,使用定义和枚举)

errors.h

#ifndef ERRORS_H
# define ERRORS_H

# define CALL_MSG(var) MSG_ ## var
# define MSG_1 "illegal option -- "

enum            e_errors
{
    NOT,
    ILLOPS = 1,
    ILLOPS_QUIT = 1,
    NFOUND
};

typedef enum e_errors t_errors;

#endif

的main.c

void            err_manager(int errnum, t_errors err)
{
    ft_putstr("\033[91mls: ");
    if (err != 0)
        ft_putstr(CALL_MSG(err));
    if (errno != 0)
        ft_putendl(strerror(errno));
    ft_putstr("\033[0m");
    errnum = errnum;
    return ;
}

int     main(int ac, char **av, char **env)
{
    printf("Vous avez %d arguments\n", ac - 1);
    printf("PWD: %s\n", get_pwd(env));
    printf("Valeur du masque: %08x\n", mask_creator(ac, av));
}

谢谢!

1 个答案:

答案 0 :(得分:0)

您无法使用宏和变量执行此操作。在代码进入编译器之前,宏由预处理器扩展;当变量获得它们的值时,它们在运行时不存在。

您可以做的是将字符串保持在运行时可访问的方式,例如数组:

<强> errors.h

char const *call_msg(t_errors err);

<强> errors.c

char const *call_msg(t_errors err) {
  static char const *const messages[] = {
    "success -- ", // or whatever NOT is supposed to mean
    "illegal option -- ",
    "not found -- ",
    ...
  };

  check_if_err_is_within_array_bounds(err); // exercise for the reader

  return messages[err];
}

<强>的main.c

ft_putstr(call_msg(err));