从main()访问单独文件中的静态函数

时间:2014-11-27 21:29:04

标签: c pointers linker

我有一个包含函数hello()的hello.c:

#include <stdio.h>
static void hello() {
   printf("hello.\n");
}

现在,我在main.c中有main(),我想从中调用hello()驻留在hello.c中。 我想我必须将一个函数指针从hello.c传递给main.c中的一个函数,但我不知道怎么做到这一点。一个关于如何链接这两个文件的解释的例子会很棒!感谢。

1 个答案:

答案 0 :(得分:3)

喜欢这个吗?

<强> hello.h

#ifndef INCLUDED_HELLO_H
#define INCLUDED_HELLO_H

void (*get_hello(void))(void);

// or, better:
// typdef void(*funcptr)(void);
// funcptr get_hello(void);

#endif

<强> 的hello.c

#include "hello.h"
#include <stdio.h>

static void hello(void) {
  puts("Hello!");
}

void (*get_hello(void))(void) {
  return hello;
}

<强> main.c中

#include "hello.h"

int main(void) {
  void(*hello)(void) = get_hello();
  hello();
  get_hello()();
}

编辑:

正如我非常正确地指出的那样(对不起,我是新来的),这不是完全自我解释的。好吧,令人困惑的位实际上只是语法。我们在这里处理的是函数指针。它们就像它在锡上所说的那样:指向函数的指针,通过它可以调用函数。语法是令人反感的,这就是为什么typedef是你的朋友,但你就是。

hello中的

main是一个函数指针变量;它是一个指向函数的指针,该函数不返回任何内容。

get_hello是一个不带参数的函数,返回一个指向函数的指针,该函数不返回任何参数。类似地,

`int (*foo(double))(float);

将取消一个函数foo取一个double并返回一个指向函数的指针,该函数使用float并返回一个int。

而且,那就是它的全部内容。原则上它非常简单,只有可怕的语法使它看起来很复杂。