在下面的代码中,我想使用宏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 --
我如何为我的消息制作类似的系统(如果可能,使用定义和枚举)
#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
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)); }
谢谢!
答案 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));