【发布时间】:2014-03-31 02:42:23
【问题描述】:
- 平台:Linux 3.2.0 x86 (Debian Wheezy)
- 编译器:GCC 4.7.2 (Debian 4.7.2-5)
我正在编写一个返回指向 char 的指针的函数。我仍然想“返回”一个表示发生了什么错误的整数值,因此该函数将一个指向将用作标志的整数的指针作为参数。这是一个声明的例子
char* foo(int *flag, etc.)
如果用户不想知道发生了什么具体错误,我想允许 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
}
我不想一遍又一遍地编写该代码,而是为它编写一个宏。但是代码不止一个语句,这意味着我必须将宏放在它自己的代码块中,或者宏必须已经在它自己的代码块中。
#define RETFLAG(err, ret) if(flag != NULL) *flag = err; return ret;
... //Symbolic Code
if(error) //Some error has occured
{RETFLAG(1, NULL)} //Notice the {}
另一种方法是,
//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)
这两种方法都可以,但我不喜欢借调的方法,因为我想像这样在宏的末尾放一个分号,
//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
我知道分号是不必要的,但我认为如果您没有实际查看 RETFLAG 的定义,它会更具可读性。我已经尝试使用不必要的分号,并且我的编译器没有抱怨,并且据我所知该函数工作正常。所以我的问题是,是不必要的分号合法语法。如果合法,是否合适?
【问题讨论】: