忽略分号C语法

Joh*_*inz 2 c syntax macros

  • 平台:Linux 3.2.0 x86(Debian Wheezy)
  • 编译:GCC 4.7.2(Debian 4.7.2-5)

我正在编写一个返回指向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的定义,它更具可读性.我已经尝试使用不必要的分号,我的编译器没有抱怨,我可以告诉功能正常工作.所以我的问题是,是不必要的分号法律语法.如果合法是正确的吗?

Ray*_*hen 6

你根本不需要宏.

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)


tim*_*rau 5

你可以用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)

这样,您不必担心范围,也没有额外的分号.