如果变量名不跟在char *之后,const char *是否有效?

时间:2018-10-23 02:23:46

标签: c++ pointers syntax parameters const

我有一个分配给我们的名为Mystring的不完整类,目的是实现C ++字符串类的所有功能。

好吧,一些函数声明和定义都以const char*作为参数,但是没有变量名,因此我没有得到任何编译器错误。

我的问题是:如果这是一个有效的参数,那意味着什么?如果无效,为什么不生成错误?以下是使用示例:

bool operator==(const Mystring&, const char *);

Mystring& operator=(const char * );

我应该实现这些功能,但是我无法绕过这个看似不完整的参数。

5 个答案:

答案 0 :(得分:1)

不需要参数名称。这只是C ++语法的怪癖。如果您拒绝在函数定义中为参数指定名称,则将无法访问其值。

相关:Why do function prototypes include parameter names when they're not required?

答案 1 :(得分:0)

bool operator==(const Mystring&, const char *);行只是一个声明。 它告诉编译器该函数采用2个类型为const Mystring&const char*的参数。此时,编译器不需要确切的变量名。

在您要定义函数的.cpp文件中,您将必须提供变量名称,就像在逻辑中使用它们一样。编译器将编译此代码并使用此代码生成可执行文件。

bool operator==(const Mystring& str, const char* subStr)
{
     //Logic here which uses variable str and subStr
}

答案 2 :(得分:0)

Nate,欢迎您出现堆栈溢出!

您提供给我们的那行实际上是一个功能声明。这用于在实际定义主体之前声明函数的签名:

// Function declaration
bool operator==(const MyString&, const char*);

// Function that uses operator==
int main()
{
    MyString str = new MyString();
    char* ptr = nullptr;

    if (str == ptr)
    {
        ...
    }
}

// Function definition
bool operator==(const MyString& left, const char* right)
{
    ...
}

答案 3 :(得分:0)

您使用的语法(无主体的函数)是函数声明。它只是说有一个稍后将要定义或链接的函数,该函数具有布尔返回类型和两个给定类型的参数,顺序是:此时的名称无关紧要。此函数声明也是在人类任务规范中指定输入和输出的便捷方法。这适用于C ++和C。

特别是在C ++中,甚至可以从函数定义(函数 with 为主体)中省略参数名称。正如其他人所说,这是合法的,您只是无法访问此类参数。在C中是不允许的。

根据任务实现功能时,几乎可以确定要插入名称。它们是什么取决于您。

答案 4 :(得分:0)

  

如果这是有效的[formal]参数,这意味着什么?

是的……未命名的[formal]参数有效且至少在两种方面有用。

1)调用代码可以提供[actual]参数,即使[formal]参数没有命名。这不需要实现使用它,并且是避免某些特定警告的常用方法。

示例:

int main (int, char**) {  return foo();  }
int main (int argc, char* argv[]) { return foo(argc, argv); }

两者都是有效的实现。首先,foo没有使用参数,并且通过不命名它们,编译器将不会生成有关“未使用的参数”的警告。是的,运行时总是显示一个argc,但是当shell没有找到参数时它将为0。请注意,在第一个示例中,将提供int(用于argc)(值0表示未提供数组),并且foo()的调用从不引用它。

2)功能参数有助于功能的“签名”。

Mystring& foo(const char * ); // 1
Mystring& foo();              // 2
Mystring& foo(const int&  );  // 3

3个foo(...)是唯一的。这样,编译器就可以选择最佳匹配项(或生成一个调用与任何版本都不匹配的错误),并允许链接程序找到foo()的适当实现。

  

如果无效,为什么不生成错误?

[formal]和[actual]函数参数始终是语言的一部分,即它们是有效的。因此没有错误。如果您不记得他们,则应查看该主题。