我正在编写一个返回指向char的指针的函数.我仍然想"返回"一个表示发生了什么错误的整数值,因此该函数将一个指向一个将用作标志的整数的指针作为参数.这是声明的一个例子
char* foo(int *flag, etc.)
Run Code Online (Sandbox Code Playgroud)
flag如果用户不想知道发生了什么特定错误,我想允许为NULL,因为它可能无关紧要(我不知道它是否存在,这个想法只是理论上的).如果发生错误,我会写下面的内容,
... //Symbolic Code
if(error) //Some error has occured
{
if(flag != NULL) *flag = SOME_ERR_VALUE; //Set the flag variable
return NULL; //return NULL to show that an error occured
}
Run Code Online (Sandbox Code Playgroud)
而不是一遍又一遍地编写代码,我想为它编写一个宏.但是代码不止一个语句,这意味着我必须将宏放在它自己的代码块中,或者宏必须已经在它自己的代码块中.
#define RETFLAG(err, ret) if(flag != NULL) *flag = err; return ret;
... //Symbolic Code
if(error) //Some error has occured
{RETFLAG(1, NULL)} //Notice the {}
Run Code Online (Sandbox Code Playgroud)
另一种方法是,
//Notice the {} in the definition
#define RETFLAG(err, ret) {if(flag != NULL) *flag = err; return ret;}
... //Symbolic Code
if(error) //Some error has occured
RETFLAG(1, NULL)
Run Code Online (Sandbox Code Playgroud)
这两种这些方法的工作,但我不喜欢借调之一,因为我想提出一个分号宏像这样结束,
//Notice the {} in the definition
#define RETFLAG(err, ret) {if(flag != NULL) *flag = err; return ret;}
... //Symbolic Code
if(error) //Some error has occured
RETFLAG(1, NULL); //The only difference is the semicolon
Run Code Online (Sandbox Code Playgroud)
我知道分号是不必要的,但我认为如果你没有真正查看RETFLAG的定义,它更具可读性.我已经尝试使用不必要的分号,我的编译器没有抱怨,我可以告诉功能正常工作.所以我的问题是,是不必要的分号法律语法.如果合法是正确的吗?
你根本不需要宏.
inline char *fail_with_reason(int *flag, int reason)
{
if (flag) *flag = reason;
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
然后你的功能会说
if (error) return fail_with_reason(flag, 1);
Run Code Online (Sandbox Code Playgroud)
你可以用do { ... } while(0).
#define RETFLAG(err, ret) do { if(flag != NULL) *flag = (err); return NULL; } while(0)
if (error)
RETFLAG(1, NULL);
Run Code Online (Sandbox Code Playgroud)
这样,您不必担心范围,也没有额外的分号.
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |