void() 问题 - 它不打印结果

void() issue - It doesn't print results

我正在编写一个分为三个不同文件的程序:

  1. 1) 一个名为 my.h 的 header;
  2. 一个名为 my.cpp;
  3. 的源 cpp 文件
  4. 主文件名为use.cpp;

这是他们的陈述:

/* Header file my.h
Define global variable foo and functions print and print_foo
to print results out */

extern int foo;
void print_foo();
void print(int);

/* Source file my.cpp where are defined the two funcionts print_foo() and print()
and in where it is called the library std_lib_facilities.h */

#include "stdafx.h"
#include "std_lib_facilities.h"
#include "my.h"

void print_foo() {
    cout << "The value of foo is: " << foo << endl;
    return;
} 
void print(int i) {
    cout << "The value of i is: " << i << endl;
    return;
}

/ use.cpp : definisce il punto di ingresso dell'applicazione console.
//

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

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    int foo = 7;
    int& i = foo;
    i = 99;
    char cc = '0';

    while (cin >> cc) {
        switch (cc) {
        case '1':
            void print_foo();
            break;
        case '2':
            void print();
            break;
        default:
            exit(EXIT_FAILURE);
        }
    }

    return 0;
}

我的主要问题是程序编译和 运行 正确,但它没有像我想象的那样打印任何东西。

我该如何解决?

谢谢!

狮子座

调用函数时不需要指定 return 类型。正确

void print_foo();    // This actually declares a function prototype

print_foo();

print(i);    // Pass i as argument

void print_foo();void print(); 中删除 switch 块中的 void

目前您只是在声明一个函数原型;实际上并没有调用函数。

您的 extern int foo; 方法虽然在语法上有效,但会使您的代码库更难扩展和维护:考虑显式传递参数。

你会在主函数中加入

case '1':
    print_foo();
    break;

请注意,我在案例 1 中删除了 "void" 一词。因为您没有在那里重新声明函数。你随便用。

您的代码声明 *"Define global variable foo..." 如下...

extern int foo;

...但这只是声明某个翻译单元将实际定义它(没有前导 extern 限定符)。您发布的代码中没有实际变量,这意味着您的程序不应该 link 除非您使用的某些库恰好有一个 foo 符号。

这段较短的代码浓缩了您的问题:

#include <iostream>

extern int foo;

void f()
{
    std::cout << foo << '\n';
}

int main() {
    int foo = 7;
    f();
}

可以看到编译报错信息here,即:

/tmp/ccZeGqgN.o: In function `f()':
main.cpp:(.text+0x6): undefined reference to `foo'
collect2: error: ld returned 1 exit status