问题:Objective-C 中 C 类型函数不识别 foundation 中的类

来源:互联网 发布:点对点网速测试软件 编辑:程序博客网 时间:2024/05/23 11:30

第一个工程编译成功

代码如下:

////  main.m//  App02////  Created by Cocoa on 7/1/17.//  Copyright © 2017 zsy. All rights reserved.//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {    @autoreleasepool {        // 创建一个文件写入流        char * filePath = "file:///Users/cocoa/Desktop/timezones";        CFStringRef fileStr = CFStringCreateWithCString(kCFAllocatorDefault, filePath, kCFStringEncodingUTF8);        CFURLRef fileUrl = CFURLCreateWithString(kCFAllocatorDefault, fileStr, NULL);        CFWriteStreamRef myWriteStream = CFWriteStreamCreateWithFile(kCFAllocatorDefault, fileUrl);        if (!CFWriteStreamOpen(myWriteStream)) {    // 打开流对象失败            // 获取错误            CFStreamError myerr = CFWriteStreamGetError(myWriteStream);            if (myerr.domain == kCFStreamErrorDomainPOSIX) {            } else if (myerr.domain == kCFStreamErrorDomainMacOSStatus) {                OSStatus macError = (OSStatus)myerr.error;            }        }        UInt8 buf[] = "Hello world";        CFIndex buflen = (CFIndex)strlen(buf);        BOOL done = FALSE;        while (!done) {            CFIndex bytesWritten = CFWriteStreamWrite(myWriteStream, buf, buflen);            if (bytesWritten < 0) { // 写入错误                CFStreamError err = CFWriteStreamGetError(myWriteStream);                // 报告错误                NSLog(@"数据写入错误.");            } else if (bytesWritten == 0) {                if (CFWriteStreamGetStatus(myWriteStream) == kCFStreamStatusAtEnd) {    // 数据写入完成                    done = TRUE;                }            } else if (bytesWritten != buflen) {    // 数据还没有写完                buflen = buflen - bytesWritten;                memmove(buf, buf + bytesWritten, buflen);                // 分析写入流哪里出错了                CFStreamError err = CFWriteStreamGetError(myWriteStream);                // 处理错误 err                continue;            }            done = TRUE;        }        // 关闭和销毁流读取对象        CFWriteStreamClose(myWriteStream);        CFRelease(fileUrl);        CFRelease(fileStr);        myWriteStream = NULL;        fileUrl = NULL;        fileStr = NULL;    }    return 0;}

第二个工程编译失败,

代码如下:

////  main.m//  App03////  Created by Cocoa on 7/1/17.//  Copyright © 2017 zsy. All rights reserved.//#import <Foundation/Foundation.h>void myRetaion(char * ptr);void myRelease(char * ptr);void myCopyDesc(char * ptr);// 回调函数void myCallBack(CFReadStreamRef stream,CFStreamEventType event,void * myPtr);int main(int argc, const char * argv[]) {    @autoreleasepool {        char * hostStr = "127.0.0.1"; // 这里是一个远程的主机        UInt32 port = 18888;        CFStringRef hostString = CFStringCreateWithCString(kCFAllocatorDefault, hostStr, kCFStringEncodingUTF8);        // 创建 ReadStream 对象        CFReadStreamRef myReadStream;        CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, hostString, port, &myReadStream, NULL);        // 在打开 Socket Read Stream 之前 创建一个 Context        char * myPtr = "";        CFStreamClientContext myContext = {0,myPtr,myRetaion,myRelease,myCopyDesc};        // 打开流之前将流添加 RunLoop 中        CFOptionFlags registeredFlags = kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered;        if (CFReadStreamSetClient(myReadStream, registeredFlags, myCallBack, &myContext)) {            // 设置流成功            // 将流添加到 RunLoop 中            CFReadStreamScheduleWithRunLoop(myReadStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);        }        // 打开一个非阻塞的读取流        if (!CFReadStreamOpen(myReadStream)) {            // 如果打开失败            CFStreamError myErr = CFReadStreamGetError(myReadStream);            if (myErr.error != 0) {                // 一个错误发生了                if (myErr.domain == kCFStreamErrorDomainPOSIX) {                } else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) {                    OSStatus macError = (OSStatus)myErr.error;                }            }        } else {            CFRunLoopRun();        }    }    return 0;}void myRetaion(char * ptr) {}void myRelease(char * ptr) {}void myCopyDesc(char * ptr) {}// 回调函数void myCallBack(CFReadStreamRef stream,CFStreamEventType event,void * myPtr) {    switch (event) {        case kCFStreamEventHasBytesAvailable:            // It is safe to call CFReadStreamRead,it won't block because bytes are avaliable.            UInt8 buf[BUFSIZ];            CFIndex bytesRead = CFReadStreamRead(stream, buf, BUFSIZ);            if (bytesRead > 0) {                // 读取到数据了                NSLog(@"%S",buf);            }            // bytesRead == 0 和 bytesRead < 0 的情况可以忽视因为这些情况会触发其他事件            break;        case kCFStreamEventErrorOccurred:            CFStreamError error = CFReadStreamGetError(stream);            // 报告错误            // reportError(error);            // 关闭和释放流            CFReadStreamClose(stream);            CFRelease(stream);            break;        case kCFStreamEventEndEncountered:            // 所有的数据都已经读取完毕了            // reportCompletion();            // 将流冲 RunLoop 中移除,并且关闭和销毁流            CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);            CFReadStreamClose(stream);            CFRelease(stream);            break;        default:            break;    }}

错误报告:

/Users/cocoa/Documents/Xcode/Objective-C/Workspace02/App03/App03/main.m:30:13: error: expected expression            UInt8 buf[BUFSIZ];            ^/Users/cocoa/Documents/Xcode/Objective-C/Workspace02/App03/App03/main.m:31:58: error: use of undeclared identifier 'buf'            CFIndex bytesRead = CFReadStreamRead(stream, buf, BUFSIZ);                                                         ^warning: format specifies type 'const unichar *' (aka 'const unsigned short *') but the argument has type '<dependent type>' [-Wformat]/Users/cocoa/Documents/Xcode/Objective-C/Workspace02/App03/App03/main.m:34:29: error: use of undeclared identifier 'buf'                NSLog(@"%S",buf);                            ^/Users/cocoa/Documents/Xcode/Objective-C/Workspace02/App03/App03/main.m:41:13: error: expected expression            CFStreamError error = CFReadStreamGetError(stream);            ^/Users/cocoa/Documents/Xcode/Objective-C/Workspace02/App03/App03/main.m:81:52: warning: incompatible pointer types initializing 'void *(*)(void *)' with an expression of type 'void (char *)' [-Wincompatible-pointer-types]        CFStreamClientContext myContext = {0,myPtr,myRetaion,myRelease,myCopyDesc};                                                   ^~~~~~~~~/Users/cocoa/Documents/Xcode/Objective-C/Workspace02/App03/App03/main.m:81:62: warning: incompatible pointer types initializing 'void (*)(void *)' with an expression of type 'void (char *)' [-Wincompatible-pointer-types]        CFStreamClientContext myContext = {0,myPtr,myRetaion,myRelease,myCopyDesc};                                                             ^~~~~~~~~/Users/cocoa/Documents/Xcode/Objective-C/Workspace02/App03/App03/main.m:81:72: warning: incompatible pointer types initializing 'CFStringRef (*)(void *)' with an expression of type 'void (char *)' [-Wincompatible-pointer-types]        CFStreamClientContext myContext = {0,myPtr,myRetaion,myRelease,myCopyDesc};                                                                       ^~~~~~~~~~/Users/cocoa/Documents/Xcode/Objective-C/Workspace02/App03/App03/main.m:105:30: warning: unused variable 'macError' [-Wunused-variable]                    OSStatus macError = (OSStatus)myErr.error;                             ^5 warnings and 4 errors generated.

简单的说,错误是这个样子的:

这里写图片描述

这里写图片描述

错误解决方法:

case 里面有局部变量需要用大括号括起来

这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾照过期1个月怎么办 上海驾驶证b证扣分怎么办 临时牌驾照丢了怎么办 行驶证年审过期两年怎么办 驾证到期了没换怎么办 在非洲被蚊子咬怎么办 身份证丢了被非法贷款怎么办 未满16岁怎么办身份证 放弃继承权后想反悔怎么办 上海居住证积分中社保断怎么办 换驾驶证但是身份证地址变动怎么办 驾驶证b证扣分了怎么办 c1驾证过期没审怎么办 驾照报名三年过期了怎么办 新车行驶证过期了怎么办 行驶证忘了审怎么办 摩托车驾驶证副本丢了怎么办 人被全险车撞了怎么办 被全险车撞了怎么办 驾驶证和行驶证遗失怎么办 户口迁移身份证没换驾照怎么办 户口迁回时身份证掉了怎么办 户口毕业托管身份证掉了怎么办 身份证和户口都掉了怎么办 毕业生户口迁回原籍没身份证怎么办 落户上海后怎么办医保卡 小车临时牌过期了怎么办 驾驶证地址错了一个字怎么办 驾驶证名下车辆有违章怎么办 a2如果扣12分怎么办 b2一次超速12分怎么办 b2本扣了12分怎么办 驾照扣了27分怎么办 大车一次扣12分怎么办 a2驾照扣10分怎么办 驾驶证强制降级没给驾驶证怎么办 6P升11.2卡了怎么办 b2驾照记满12分怎么办 c1驾驶证没分了怎么办 驾照扣了15分怎么办 驾驶证暂扣六个月后怎么办