【问题标题】:Compiler doesn't like void :'( - function declaration编译器不喜欢 void :'( - 函数声明
【发布时间】:2011-12-22 13:14:36
【问题描述】:

我正在尝试编写一个函数来更改一些文件夹名称,但我在实际声明中遇到了困难。

这是我的代码:

void ChangeVersion(char* NewVer)
{
    ifstream show_current_version;
    show_current_version.open(*removed*);
    char show_current_version_var[1024];
    if (show_current_version.is_open())
    {
        while (!show_current_version.eof())
        {
              show_current_version >> show_current_version_var;
        }                                         
    }
    show_current_version.close();
    // show_current_version_var is old version
    char OldVersion[1024] = show_current_version_var;

    // start rename
    cout << "Changing versions...";
    rename("*removed*", OldVersion);
    rename(NewVer, "*removed*");
    cout << "done!" << endl; 
} 

如您所知,我是 C++ 新手...

我在各种 c++ 教程网站上阅读过,如果您希望函数不返回任何内容,则将其声明为 void。但是,当我这样做时,我的编译器说无效的初始化程序。我正在使用 dev-cpp。

我想这是因为我的函数是输出文本,但是在网站上,void 函数有一些 cout 语句......

我尝试使用 char* 对其进行初始化,就像我的其他函数一样,但我得到了同样的错误。与 int 和 char 相同。

感谢您的阅读。

【问题讨论】:

  • 这是在头文件中,因此没有库。
  • 为什么是循环?我猜版本号存储在文件中,但它是文件中唯一存储的东西吗?但更重要的是,你必须向我们展示你是如何调用这个函数的。
  • 这是一本不错的 C++ 书籍,您可以免费下载:Thinking in C++
  • “这是在头文件中,因此没有库”。您的实现代码不应在头文件中。这不是头文件的用途。头文件用于说“这是你可以做的”。实现文件是为了说“......这就是它的工作原理”。
  • 错误消息包括告诉您在何处检测到错误的行号。您应该检查它声称有问题的地方,而不是猜测。

标签: c++ function compiler-construction types declaration


【解决方案1】:

你真的应该仔细看看编译器的输出。它通常会告诉您哪一行包含错误,这让您有很多工作要做。

解决特定问题的违规行(据我收集,尚未尝试编译)是:

char OldVersion[1024] = show_current_version_var;

您不能将变量分配给这样的静态数组。只有少数东西可以用来初始化静态数组。例如:

char OldVersion[1024] = "Static string";
char example[1024] = { 0 };

尝试做:

char OldVersion[1024];
strncpy(OldVersion, show_current_version_var, 1024);
// Null-terminate the string for good measure
OldVersion[1023] = 0;

或者干脆使用show_current_version_var,你会使用OldVersion(我认为没有理由在你粘贴的代码中复制字符串)。

无论如何,我不知道您要完成什么,但您确实应该阅读 C++。这是一种使用起来相当棘手的语言。

【讨论】:

  • 您最好使用 strncpy 而不是 strcpy,因为我认为您不能确定 show_current_version_var 末尾会有一个空字符。
  • 您也不能确定strncpy() 是否会在末尾添加一个空值;如果目标数组中没有足够的空间,它就不会(如果有足够的空间,它会在最后放置很多空值)。
  • 由于这是一个 C++ 问题,我不希望使用任何 str() 函数,因为这些都是 C。首选 std::string。
【解决方案2】:

几件小事

当您发布代码时,请发布我们编译它所需的所有内容:

// You need these to make it compile.
#include <iostream>
#include <fstream>

using namespace std;

好的。错误:

show_current_version.open(*removed*);
                          ^^^^^^^^^   What is this supposed to be ?

这个函数需要一个 C 字符串。所以“删除”是有效的。但是星星* 没有意义。

char OldVersion[1024] = show_current_version_var;

你不能像这样复制数组:

char OldVersion[1024];
std::copy(show_current_version_var, show_current_version_var+1024, OldVersion);

最好使用 std::vector 而不是数组。然后你就可以复制了。

std::vector<char>   show_current_version_var(1024);
// STUFF
std::vector<char>   OldVersion(show_current_version_var);

或者,如果您专门存储字符串(而不是字符的 blob),那么 std::string 可能是您最好的选择。

【讨论】:

  • 我假设removed 是 OP 不希望我们看到的一些敏感内容。
  • 另外,当你有错误时,发布完整的错误信息;复制和粘贴。
【解决方案3】:

我认为你不能这样做:

char OldVersion[1024] = show_current_version_var;

您只能使用大括号列表初始化数组(例如 {'p', 'a', 'x'})。

相反,您应该尝试:

char OldVersion[1024];
memcpy (OldVersion, show_current_version_var, sizeof (OldVersion));

一个完整的、可编译的版本如下所示:

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
void ChangeVersion(char* NewVer)
{
    ifstream show_current_version;
    show_current_version.open("qqq");
    char show_current_version_var[1024];
    if (show_current_version.is_open())
    {
        while (!show_current_version.eof())
        {
              show_current_version >> show_current_version_var;
        }
    }
    show_current_version.close();
    // show_current_version_var is old version
    char OldVersion[1024];
    memcpy (OldVersion, show_current_version_var, sizeof (OldVersion));

    // start rename
    cout << "Changing versions...";
    rename("*removed*", OldVersion);
    rename(NewVer, "*removed*");
    cout << "done!" << endl;
}

int main() {
    return 0;
}

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多