我目前正在function
中开发C
以查找给定字符串的最后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
这个问题完全取决于我在网上看到的其他例子。这是一个如何使用可选功能参数?还是我离开了?我还没有实现它,因为我首先想要在做一些可怕的错误之前得到一些输入(我之前从未做过宏,这个宏大部分是从一个例子中得到的,我对它到底是什么的了解很少一样)。
答案 0 :(得分:3)
这似乎更简单:
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)
这使得ch
和strln
参数都是可选的,如果没有提供则默认为-1。它还允许你提供超过3个参数(额外的将被忽略),这可能是不受欢迎的,但可能不是一个显示阻止。