在头文件中使用void

时间:2012-12-21 21:11:14

标签: c++

这是我的头文件,auto vs static.h

#include "stdafx.h"
#include <iostream>

void IncrementAndPrint()
{
    using namespace std;
    int nValue = 1; // automatic duration by default
    ++nValue;
    cout << nValue << endl;
} // nValue is destroyed here

void print_auto()
{
    IncrementAndPrint();
    IncrementAndPrint();
    IncrementAndPrint();
}

void IncrementAndPrint()
{
    using namespace std;
    static int s_nValue = 1; // fixed duration
    ++s_nValue;
    cout << s_nValue << endl;
} // s_nValue is not destroyed here, but becomes inaccessible

void print_static()
{
    IncrementAndPrint();
    IncrementAndPrint();
    IncrementAndPrint();
}

这是我的主文件,namearray.cpp

#include "stdafx.h"
#include <iostream>
#include "auto vs static.h"
using namespace std;

    int main(); // changing this to "int main()" (get rid of ;) solves error 5. 
    {
    print_static();
    print_auto();
    cin.get();
    return 0;
    }

我正在尝试打印(cout) 2 2 2 2 3 4

错误:

Errors

我觉得我的错误就是在头文件中使用void。如何更改头文件以使我的代码能够正常工作?

参考:来自learncpp的代码

2 个答案:

答案 0 :(得分:7)

您不能声明具有相同名称和参数的两个函数。

 void IncrementAndPrint()

答案 1 :(得分:5)

与变量不同,您无法为函数赋予新值。所以这就是编译器的想法:

“哦,好的,当你说IncrementAndPrint时,你的意思是这个函数位于文件的顶部”。

然后它会看到print_auto并了解这意味着什么。但是你试着告诉它IncrementAndPrint实际上意味着另一个函数,并且编译器会感到困惑。 “但你已经告诉我IncrementAndPrint的意思!”,编辑抱怨道。

这与变量(在某种程度上)形成鲜明对比,你可以说:

int x = 0;
x = 6;

编译器理解,x在某一时刻具有值0,但您现在说“x不同,这意味着6。”。但是,你不能说:

int x = 0;
int x = 6;

因为当您在变量名称之前包含类型时,您正在定义一个新变量。如果您不包含类型,则只需指定旧类型。

您必须为IncrementAndPrint提供不同的名称。

或者,您可以让他们采用不同的参数,例如void IncrementAndPrint(int x);void IncrementAndPrint(double y);。我不建议这里,因为你不需要参数。

另一种可能性是使用namespace。它看起来像这样:

namespace automatic_variables {

void IncrementAndPrint() {
    // automatic variable version
}
void print() {
    // automatic version
}
}
namespace static_variables {

void IncrementAndPrint() {
    // static variable version
}
void print() {
    // static version
}
}