在C中将函数作为参数传递的问题

时间:2015-02-02 17:04:29

标签: c

我是C的新手并且坚持这一点。答案here似乎被广泛接受,但我相信我遵循了正确的格式并仍然遇到问题。

这里是main()中的违规行(在main.c中)

PrintWrapper(PrintFunction, *decoded); // *decoded is a char

PrintFunction(也在main.c中):

void PrintFunction(char c)
{
    printf("%c", c);
}

原型声明(在p1a2.h中 - 与main.c在同一目录中)

extern void PrintWrapper(void (*)(char), char c);

实际的源隐藏在printwrapper.o(与main.c相同的目录)中。这是一个赋值,是一个非常人为的将函数作为参数传递的用法。我用

编译程序
g++ main.c printwrapper.o -Wall -g -o tnine 

并获得编译器错误(如果相关则反引号不是拼写错误)

<path>/main.c:42: undefined reference to `PrintWrapper(void (*)(char), char'

为什么会这样?我希望我能忽略一些简单的事情。

3 个答案:

答案 0 :(得分:4)

在使用g ++时,编译器需要修改函数名称(有关详细信息,请参阅this wikipedia article
要解决此问题,请使用gcc代替g++或尝试以下操作:

extern "C" void PrintWrapper(void (*)(char), char*);

答案 1 :(得分:1)

您向我们展示的代码是有效的。

看起来printwrapper.o只是不包含此类功能。

答案 2 :(得分:1)

您应该使用gcc而不是g++来编译C代码。后一个前端用于C ++代码,符号受name mangling的约束。假设您真的在询问C语言,编译项目的正确方法是:

gcc main.c printwrapper.o -Wall -g -o tnine

以下是一些工作样本:

的main.c

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

void PrintFunction(char c)
{
    printf("%c\n", c);
}

int main(void)
{
    char c = 'a';
    char *decoded = &c;

    PrintWrapper(PrintFunction, *decoded);

    return 0;
}

pla2.h

extern void PrintWrapper(void (*)(char), char c);

printwrapper.c

extern void PrintWrapper(void (*f)(char), char c)
{
    f(c);
}

然后:

$ gcc -c printwrapper.c 

$ gcc main.c printwrapper.o -Wall -g -o tnine

$ ./tnine 
a