我是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'
为什么会这样?我希望我能忽略一些简单的事情。
答案 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
以下是一些工作样本:
#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;
}
extern void PrintWrapper(void (*)(char), char 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