如何使用Xcode编辑.cpp文件?

时间:2019-03-22 04:30:09

标签: c++ xcode

当我使用Xcode for C ++编辑模拟过程的简单演示时,会出现错误:

 Undefined symbols for architecture x86_64: 
 "exit()", referenced from:   
  menu() in main.o  
 "kill()", referenced from:       
  menu() in main.o 
ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

以我有限的C ++经验,我从来没有遇到过这个问题,我在网上搜索了很长时间,但是没有用。请帮助或尝试给我一些实现该想法的想法。预先感谢。

我的Xcode版本是10.1。

<!-- language: C++ -->
    #include<iostream>
    #include<string.h>
    #include<stdlib.h>
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    void create();
    void kill();
    void display();
    void exit();
    struct PCB
    {
        char NAME[10];
        long ID;
        float TIME;
        int PRIORITY;
    };PCB pcb[100];
    typedef struct QNode
    {
        int data;
        struct QNode*next;
    }QNode,*QueuePtr;
    typedef struct
    {
        QueuePtr front;
        QueuePtr rear;
    }LinkQueue;LinkQueue Ready,Empty;
    int InitQueue()
    {
        Ready.front=Ready.rear=new QNode;
        Empty.front=Empty.rear=new QNode;
        Ready.front->next=NULL;
        Empty.front->next=NULL;
        return OK;
    }
    void menu()
    {
        std::cout<<"****=========="<<"1. 进程创建 \n";
        std::cout<<"****=========="<<"2. 进程撤销 \n";
        std::cout<<"****=========="<<"3. 就绪队列显示 \n";
        std::cout<<"****=========="<<"4. 退出 \n";
        int choice;
        std::cout<<" 请选择: ";
        std::cin>>choice;
        switch(choice)
        {
            case 1:create();break;
            case 2:kill();break;
            case 3:display();break;
            case 4:exit();
        }
    }
    void create()
    {
        char name[10];
        long id;
        float time;
        int priority;
        int n;
        QNode *p;
        std::cout<<" 请输入要创建进程的数目: ";
        std::cin>>n;
        for(int i=1;i<=n;i++)
        {
            std::cout<<" 进程 ID :"; std::cin>>id;
            for(int j=i-1;j<=n;j++)
            {
                while(id==pcb[j].ID)
                {
                    std::cout<<" 进程 ID 已存在 "<<std::endl;
                    std::cout<<" 进程 ID :"; std::cin>>id;
                }
            }
            std::cout<<" 进程名: ";
            std::cin>>name;
            std::cout<<" 运行时间: ";
            std::cin>>time;
            std::cout<<" 优先级: ";
            std::cin>>priority;
            n++;// 保存当前就绪进程数
            strcpy(pcb[n].NAME,name);
            pcb[n].ID =id;
            pcb[n].TIME =time;
            pcb[n].PRIORITY =priority;
            p=new QNode;// 插入就绪队列
            p->data=n;
            p->next=NULL;
            Ready.rear->next=p;
            Ready.rear=p;
        }


    for(int i=1;i<=n;i++)// 按优先级排队
    {
        for(int j=i+1;j<=n;j++)
            if(pcb[i].PRIORITY<pcb[j].PRIORITY)
            {
                pcb[0]=pcb[i];
                pcb[i]=pcb[j];
                pcb[j]=pcb[0];
            }
    }
    menu();
    }
    void kill(int n)// 进程终止
    {
        long id;
        QNode *p,*q;
        std::cout<<" 请输入要终止的进程 ID:";
        std::cin>>id;
        p=Ready.front->next;
        if(p==NULL)
            std::cout<<" 就绪进程为空! ";
        while(p!=NULL)
        {
            if(id==pcb[n].ID)// 终止进程是队列最后一个
            {
                if(n==1) // 队列中只有一个进程,且是终止进程
                {
                    q=new QNode;
                    q->data=Ready.rear->data;
                    Empty.rear->next=p;
                    Empty.rear=p;
                    Ready.front =Ready.rear;
                    Ready.front ->next =NULL;
                    n--;
                    std::cout<<" 进程已终止! ";
                    break;
                }
                else //队列中进程多个
                {
                    while(p!=NULL)
                    {
                        if(p->next->next ==NULL)
                        {
                            q=new QNode;
                            q->data=Ready.rear->data;
                            Empty.rear->next=p;
                            Empty.rear=p;
                            p->next =NULL;
                            Ready.rear =p;
                            n--;
                            std::cout<<" 进程已终止! ";
                            break;
                        }
                        p=p->next ;
                    }}}
            if(id==pcb[p->data].ID)
            {
                if(Ready.front==Ready.rear)
                    std::cout<<" 队列为空 !"<< std::endl;
                while(p!=NULL)
                {
                    pcb[p->data]=pcb[p->data+1];// 修改 PCB 数组里的值
                    if(p->next ->next ==NULL)
                    {
                        q=new QNode;
                        q->data=Ready.rear->data;
                        Empty.rear->next=p;
                        Empty.rear=p;
                        p->next =NULL;
                        Ready.rear =p;
                        std::cout<<" 进程已终止! ";
                        break;
                    }
                    p=p->next;
                }
                n--;
                break;
            }
            p=p->next ;
        }
        menu();
    }
    void display()
    {
        QNode *p;
        p=Ready.front->next;
        std::cout<<"ID"<<" "<<" 名字 "<<" "<<" 运行时间 "<<" "<<" 优先级"<<std::endl;
        while(p!=NULL)
        {
            std::cout<<pcb[p->data].ID<<""<<pcb[p->data].NAME<<""<<pcb[p->data].TIME <<""<<pcb[p->data].PRIORITY<<std::endl;
            p=p->next ; }
        menu(); }
    int main()
    {
        InitQueue();
        pcb[0].ID =0;
        menu();
    }

1 个答案:

答案 0 :(得分:0)

我知道:

void kill();
void exit();

当您实际将代码定义为时,在C ++文件的顶部声明:

void kill(int n)// 进程终止
{
...
...

更改C ++文件顶部的声明以匹配代码。并且每当您在代码中调用kill时,都传递1或任何您想要的n(例如kill(1))。

另外,unlike killexit() already exists in C++,您应该从代码顶部删除该声明,并且每当调用它时,都应使用exit(0)之类的东西。