gpt4 book ai didi

c - 这是宏滥用吗?

转载 作者:太空狗 更新时间:2023-10-29 16:39:22 25 4
gpt4 key购买 nike

我在对一些代码进行逆向工程时发现了这个...

/************************************************************************/
/* */
/* MACRO CHECK_FREAD */
/* */
/* CHECK_FREAD is used to check the status of a file read. It */
/* is passed the return code from read and a string to print out if */
/* an error is detected. If an error is found, an error message is */
/* printed out and the program terminates. This was made into a */
/* macro because it had to be done over and over and over . . . */
/* */
/************************************************************************/

#define CHECK_FREAD(X, msg) if (X==-1) \
{ \
return(DCD_BADREAD); \
}

基本上,此文件中的特定函数集会在执行(c-read)检查结果是否有错误时调用此函数。他们也对 EOF 进行了类似的检查...基本上据我所知,他们这样做是为了在函数中间的很多地方插入错误返回。

例如

/*  Read in an 4                */
ret_val = read(fd, &input_integer, sizeof(int32));

CHECK_FREAD(ret_val, "reading an 4");
CHECK_FEOF(ret_val, "reading an 4");

if (input_integer != 4)
{
return(DCD_BADFORMAT);
}

/* Read in the number of atoms */
ret_val = read(fd, &input_integer, sizeof(int32));
*N = input_integer;

CHECK_FREAD(ret_val, "reading number of atoms");
CHECK_FEOF(ret_val, "reading number of atoms");

现在我刚刚回到 c/c++ 编程,而且我一开始就很少使用宏,但这是滥用宏吗?

我读了这个... When are C++ macros beneficial?

...这听起来不像任何犹太洁食示例,所以我的猜测是"is"。但我想获得更明智的意见,而不是仅仅做出有根据的猜测……:)

...呃,使用某种包装不是更好吗?

最佳答案

因为不一样。如果将相同的东西放入函数中,您将得到一个简短的函数,如果 X 等于 -1,则返回 DCD_BADWRITE。然而,有问题的宏从 containing 函数返回。示例:

int foobar(int value) {
CHECK_FREAD(value, "Whatever");
return 0;
}

将扩展为:

int foobar(int value) {
if (value == -1) {
return (DCD_BADWRITE);
};
return 0;
}

但是,如果它是一个函数,则外部函数 (foobar) 会愉快地忽略结果并返回 0。

一个看起来非常像函数但在关键方面表现不同的宏是一个主要的禁忌 IMO。我会说是的,它宏滥用。

关于c - 这是宏滥用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3630222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com