【问题标题】:Optional Function Parameters C可选功能参数 C
【发布时间】:2012-08-24 06:16:32
【问题描述】:

我目前正在C 中开发function,以查找给定字符串的最后一个char 出现。如果没有给出字符串的长度,我希望它使用某种方法(我自己的),否则它将只使用strrchr。所以经过一番研究后,我决定macro 将是要走的路。这就是我所拥有的:

 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 对此感到抱歉。
  • @KingsIndian,该参数会影响声明。如果您不需要在strlchr 中使用strlen,那么将该名称作为参数没有问题。不过,我自己不会使用它。
  • @keithmiller,你的最终目标是什么?您是否希望 C 能够根据给出的 2 个或 3 个参数调用不同的函数?即你想要像 C++ 中那样的函数重载吗?据我所知,这是不可能的。
  • 我相信这是您唯一的选择。您也可以尝试使用名称定义 -1,以便使用该名称,而不是其他人难以理解的魔法“-1”。
  • 或使用包装函数。另外,这里有一些疯狂的解决方案:stackoverflow.com/questions/1472138/c-default-arguments

标签: c macros variadic-functions optional-parameters


【解决方案1】:

看起来这样做会更简单:

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)

这使得chstrln 参数都是可选的,如果没有提供则默认为-1。它还允许您提供 3 个以上的参数(额外的参数将被忽略),这可能是不可取的,但可能不会阻止。

【讨论】:

  • 这很好,但我才意识到它有问题。如果您希望 ch 默认为 0strlen-1 怎么办?写strlchr_macro(__VA_ARGS__, 0, -1) 不会像你期望的那样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多