2

这是我的头文件,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

错误:

错误

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

参考:来自learncpp的代码

4

2 回答 2

7

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

 void IncrementAndPrint()
于 2012-12-21T21:13:30.777 回答
5

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

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

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

这与变量(以某种方式)形成对比,您可以在其中说:

int x = 0;
x = 6;

编译器在某一时刻明白,x有 value 0,但是你说“x现在不同了,它意味着6.”。但是,您不能说:

int x = 0;
int x = 6;

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

您将不得不提供IncrementAndPrint不同的名称。

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

另一种可能性是使用命名空间。它看起来像这样:

namespace automatic_variables {

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

void IncrementAndPrint() {
    // static variable version
}
void print() {
    // static version
}
}
于 2012-12-21T21:22:49.323 回答