可选函数参数C

3

我目前正在开发一个用于查找给定字符串中最后一个字符出现的C语言函数。如果没有给定字符串的长度,我希望它使用一种特定的方法(我的方法),否则它将只是使用strrchr。经过一番研究后,我决定使用宏定义。这就是我写的代码:

 size_t strlchr(const char *str, const char ch, const int strln)
 {
    //function code if strlen == -1 (no parameter)
    //function code if strlen != -1 (parameter given)
 }

#define strlchr_arg2(str, ch) strlchr(str, ch, -1)
#define strlchr_arg3(str, ch, strlen) strlchr(str, ch, strln)
#define getarg4(arg2, arg3, arg4...) arg4
#define strlchr_macro(...) \ getarg4(__VA_ARGS__, strlchr(arg3, \ arg2, )
#define strlchr(...) strlchr_macro(__VA_ARGS__)(__VA_ARGS__)

这是实现我的目标的正确方式吗?还有更有效的方法吗?此外,我必须在宏之前在源文件中拥有函数代码吗?通常我会在底部编写功能,而在源文件的顶部有我的声明,在这种情况下是 size_t strlchr(const char*, const char, const int),最后我的宏等位于源文件的顶部。因此,理想情况下,我的布局将是:

macros/defines
function declaration
function code

这个问题完全基于我在网上看到的其他示例。这是使用可选函数参数的方法吗?还是我完全错了?我尚未实现它,因为我想先得到一些输入,以免做错事情(我以前从未制作过宏,而且这个宏大部分是从一个示例中获取的,我对它的理解很少)。


抱歉,@Kingsindian,我更新了我的问题。 - Keith Miller
1
@KingsIndian,参数会遮盖声明。如果您不需要在strlchr中使用strlen,那么将该名称用作参数是没有问题的。不过我自己不会这样做。 - Shahbaz
1
@keithmiller,你的终极目标是什么?你想让C能够根据给出的参数数量调用不同的函数吗?也就是说,你想要像C++中那样的函数重载吗?据我所知,这是不可能的。 - Shahbaz
那是我的终极目标,回想起来,如果我没有字符串的长度,手动输入“-1”可能更合理。 - Keith Miller
2
我相信那是你唯一的选择。你也可以尝试用一个名称来定义-1,这样你就可以使用该名称,而不是神奇且难以理解的“-1”。 - Shahbaz
1
请返回翻译文本: 或使用包装函数。这里还有一些疯狂的解决方案:https://dev59.com/lnM_5IYBdhLWcg3wNwUv - Karoly Horvath
1个回答

4

看起来做起来会更简单:

size_t strlchr(const char *str, const char ch, const int strln)
{
    //function code if strlen == -1 (no parameter)
    //function code if strlen != -1 (parameter given)
}


#define strlchr_macro(STR, CH, STRLN, ...) strlchr(STR, CH, STRLN)
#define strlchr(...) strlchr_macro(__VA_ARGS__, -1, -1)

这使得chstrlen参数都是可选的,如果未提供,则默认为-1。它还允许您提供超过3个参数(额外的参数将被忽略),这可能不是理想的情况,但可能不会成为阻碍。

这很好,但我刚意识到它有一个问题。如果您想要ch默认为0strlen-1怎么办?编写strlchr_macro(__VA_ARGS__, 0, -1)将不会按您的预期工作。 - Shahbaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接