gpt4 book ai didi

c - 忽略分号 C 语法

转载 作者:行者123 更新时间:2023-12-04 11:42:32 27 4
gpt4 key购买 nike

  • 平台: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 的定义,它的可读性会更高。我已经尝试使用不必要的分号,而且我的编译器没有提示,而且据我所知,该函数工作正常。所以我的问题是,是不必要的分号合法语法。如果合法,是否合适?

最佳答案

您根本不需要宏。

inline char *fail_with_reason(int *flag, int reason)
{
if (flag) *flag = reason;
return NULL;
}

然后你的函数会说

if (error) return fail_with_reason(flag, 1);

关于c - 忽略分号 C 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22752816/

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