在函数周围传递char[]

passing char[] around functions

本文关键字:char 函数 周围传      更新时间:2023-10-16

我正在尝试将一些重载函数链接在一起。这本应该很简单,但我却犯了错误。这是代码:

void output(char c[])
{
    output(c, 0);
}
void output(char c[], int x)
{
    int l = strlen(c) - x;
    output(c, x, l);
}
void output(char c[], int x, int y)
{
    cout << c;
}
int main()
{
    output("myname");
    output("myname", 3);
    output("myname", 2, 4);
}

我得到的错误与链接的部分(output(c, 0);output(c, x, l);)有关。错误为:

"No matching function for call to 'output (char *&, int)'
"No matching function for call to 'output (char *&, int &, int &)'

解释一下我做错了什么也不错。

我认为问题与您的函数缺乏原型这一事实有关。在这种情况下,您应该重新排序函数,以便您调用的函数出现在调用它们的函数之前:

void output(const char c[], int x, int y)
{
    cout << c;
}
void output(const char c[], int x)
{
    int l = strlen(c) - x;
    output(c, x, l);
} 
void output(const char c[])
{
    output(c, 0);
}

但在定义所有函数之前,最好坚持使用原型。

还要注意,字符串文字是const。由于函数不修改字符串文字的内容,因此应该声明const char c[]而不是char c[]

您必须首先定义以后将要使用的所有函数。因此,在您的情况下,我建议先定义函数原型,然后再实现所有这些原型。我的意思是:

void output(char c[], int x);
void output(char c[], int x, int y);
void output(char c[])
{
    output(c, 0);
}
void output(char c[], int x)
{
    int l = strlen(c) - x;
    output(c, x, l);
}
void output(char c[], int x, int y)
{
    std::cout << c;
}
int main()
{
    output("myname");
    output("myname", 3);
    output("myname", 2, 4);
}

C++要求首先声明您调用的所有函数。如果编译器没有在代码中的某个位置看到函数的声明(换句话说,它的原型),就无法调用函数。

因此,为了让它发挥作用,你应该首先声明所有的函数(换句话说,放置所有的原型),然后再调用它们:

// Declarations go first
void output(char [], int);
void output(char [], int, int);
void output(char c[])
{
    output(c, 0);
}
void output(char c[], int x)
{
    int l = strlen(c) - x;
    output(c, x, l);
}
void output(char c[], int x, int y)
{
    cout << c;
}

这样,编译器将在调用函数之前获得所有需要的原型。