对于IOS Objective-C,如何在.m文件中调用C文件的函数?
在新的对于IOS Objective-C,如何在.m文件中调用C文件的函数?,ios,objective-c,Ios,Objective C,在新的Objective-C项目中,它创建文件ViewController.m 我将C文件和头文件的另一个源代码添加到此Objective-C项目 如果C文件中的函数如下所示: int dump(addr) { //function code } 我将按钮添加到ViewController.m中,如下代码所示 - (IBAction)showclient:(id)sender { //How to call the function in C file here ? } 如何
Objective-C项目中
,它创建文件ViewController.m
我将C文件
和头文件
的另一个源代码添加到此Objective-C项目
如果C文件中的函数如下所示:
int dump(addr)
{
//function code
}
我将按钮添加到ViewController.m
中,如下代码所示
- (IBAction)showclient:(id)sender {
//How to call the function in C file here ?
}
如何在按下按钮后调用ViewController.m
中的转储功能
-----------------------------------编辑--------------------------------
我想在.m文件中调用的函数
/*
*转储整个arp表
*/
int
转储(地址)
乌龙地址;
{
int-mib[6];
所需尺寸;
char*host、*lim、*buf、*next;
结构rt_msghdr*rtm;
结构sockaddr_inarp*sin;
结构sockaddr_dl*sdl;
外部内部h_errno;
结构主机*hp;
int found_entry=0
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0;
mib[3] = AF_INET;
mib[4] = NET_RT_FLAGS;
mib[5] = RTF_LLINFO;
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
err(1, "route-sysctl-estimate");
if ((buf = malloc(needed)) == NULL)
err(1, "malloc");
if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
err(1, "actual retrieval of routing table");
lim = buf + needed;
for (next = buf; next < lim; next += rtm->rtm_msglen) {
rtm = (struct rt_msghdr *)next;
sin = (struct sockaddr_inarp *)(rtm + 1);
sdl = (struct sockaddr_dl *)(sin + 1);
if (addr) {
if (addr != sin->sin_addr.s_addr)
continue;
found_entry = 1;
}
if (nflag == 0)
hp = gethostbyaddr((caddr_t)&(sin->sin_addr),
sizeof sin->sin_addr, AF_INET);
else
hp = 0;
if (hp)
host = hp->h_name;
else {
host = "?";
if (h_errno == TRY_AGAIN)
nflag = 1;
}
printf("%s (%s) at ", host, inet_ntoa(sin->sin_addr));
if (sdl->sdl_alen)
ether_print((u_char *)LLADDR(sdl));
else
printf("(incomplete)");
if (rtm->rtm_rmx.rmx_expire == 0)
printf(" permanent");
if (sin->sin_other & SIN_PROXY)
printf(" published (proxy only)");
if (rtm->rtm_addrs & RTA_NETMASK) {
sin = (struct sockaddr_inarp *)
(sdl->sdl_len + (char *)sdl);
if (sin->sin_addr.s_addr == 0xffffffff)
printf(" published");
if (sin->sin_len != 8)
printf("(weird)");
}
printf("\n");
}
return (found_entry);
}
mib[0]=CTL\u NET;
mib[1]=PF_路由;
mib[2]=0;
mib[3]=AF_INET;
mib[4]=净放射性标志;
mib[5]=RTF_linfo;
if(sysctl(mib,6,NULL,&needed,NULL,0)<0)
err(1,“路由系统控制权估计”);
if((buf=malloc(需要))==NULL)
错误(1,“malloc”);
if(sysctl(mib,6,buf,&needed,NULL,0)<0)
err(1,“路由表的实际检索”);
lim=需要的buf+;
对于(next=buf;nextrtm\m格伦){
rtm=(struct rt_msghdr*)next;
sin=(结构sockaddr_inarp*)(rtm+1);
sdl=(结构sockaddr_dl*)(sin+1);
如果(地址){
if(addr!=sin->sin\u addr.s\u addr)
继续;
找到的_条目=1;
}
如果(nflag==0)
hp=gethostbyaddr((caddr__t)和(sin->sin_addr),
sizeof sin->sin地址,AF INET);
其他的
hp=0;
如果(hp)
主机=hp->h_名称;
否则{
host=“?”;
如果(h_errno==重试)
nflag=1;
}
printf(“%s(%s)at”,主机,inet_ntoa(sin->sin_addr));
如果(sdl->sdl\u alen)
以太打印((u_char*)LLADDR(sdl));
其他的
printf(“(不完整)”);
如果(rtm->rtm\u rmx.rmx\u expire==0)
printf(“永久”);
if(sin->sin\u其他&sin\u代理)
printf(“已发布(仅限代理)”;
if(rtm->rtm地址和RTA网络掩码){
sin=(结构sockaddr\u inarp*)
(sdl->sdl_len+(字符*)sdl);
如果(sin->sin\u addr.s\u addr==0xFFFFFF)
printf(“已出版”);
如果(sin->sin_len!=8)
printf(“(怪异)”);
}
printf(“\n”);
}
返回(找到输入项);
}
#在您的ViewController.m
像普通的C--函数(参数)一样调用它代码>
(3.友好的建议:买一本关于C的书)你可以像在普通C中一样简单地使用它。你只需要在obj-C类中导入头文件。你的意思是我需要导入C文件的头文件
,然后我就可以使用.m文件
中的功能了?我觉得你的C文件坏了。。。语法错误与在ansic
中调用标准C
函数的方式完全相同。参数声明的Kernighan-Ritchie风格让人困惑,尽管它仍然是有效的C语法。然而,这让我怀疑dump是否仍然有用。也许你应该扔掉这些废话?语法很古老但合法。搜索Kernighan-Ritchie风格。@Martin,语言Objective-C是在编辑完成后在ANSI C上的一薄层。在此之前,它甚至没有编译为me@Daij-Djan原来的dump
函数是正确的C语言,编译得很好。编辑后,参数类型丢失。@NikolaiRuhe我试过了,但似乎我试过了。。注意:D代码确实很好-谢谢