如何修复错误“未在此作用域中声明”?

wqsoz72f  于 2022-10-17  发布在  Unix
关注(0)|答案(2)|浏览(2253)

系统为:linux/CentOS 6.4
对于未在作用域中声明的函数,我不断收到错误。在另一个函数中调用函数是不合法的吗?我读了一篇关于函数的文章,认为这是因为我需要在调用函数时声明它们无效,但我收到了新的错误。我不确定我是否需要将它们声明为全球或其他什么。
Client.cpp:32:错误:未在此作用域中声明‘takf’
Client.cpp:33:错误:未在此作用域中声明‘putf’
Client.cpp:在函数‘QUID TAKEF(INT&)’中:
Client.cpp:44:错误:未在此作用域中声明‘Testa
Client.cpp:在函数‘void putf(int&)’中:
客户端.cpp:70:错误:未在此作用域中声明‘test’
我尝试实现的代码类型的示例:

sem_t mutex;
sem_t S;
char buffer[1024];

void error(const char *msg)
{
    perror(msg);
    exit(0);
}

/*
    void signal_callback_handler()
    {
        close(sockfd);

    }

* /

void father(int &sockfd)
{
    while(1)
    {
        srand(time(NULL));
        int ms = rand() % 2000 + 5000
        send(sockfd, DATA, strlen(DATA), 0);
        usleep(1000*ms);
        takef(sockfd);
        putf(sockfd);
    }
}

void takef(int &sockfd)
{

    /*
    *
    *  *Other code*
    *
    *
    */

    testa(sockfd);

    /*  *Other code*
    *
    *
    */
}

void testa(int &sockfd)
{
    /*
    *
    *
    *  *Other code*
    *
    *
    */
}

void putf(&sockfd)
{
    /*
    *
    *
    *  *Other code*
    *
    *
    */
    test();
    test();
    sem_post(&mutex);
}

int main(int argc, char *argv[])
{
    /*
    *
    *
    *  *Other code*
    *
    *
    */
    father(sockfd);

    return 0;
}
mznpcxlj

mznpcxlj1#

简单的解决办法。将函数定义移到空父亲()函数的上方。
在代码中

sem_t mutex;
sem_t S;
char buffer[1024];

void error(const char *msg)
{
    perror(msg);
    exit(0);
}

/*
    void signal_callback_handler()
    {
        close(sockfd);

    }

* /

void takef(int &sockfd)
{
    /*
    *
    *  *Other code*
    *
    *
    */

    testa(sockfd);

    /*  *Other code*
    *
    *
    */
}

void testa(int &sockfd)
{
    /*
    *
    *
    *  *Other code*
    *
    *
    */
}

void putf(&sockfd)
{
    /*
    *
    *
    *  *Other code*
    *
    *
    */
    test();
    test();
    sem_post(&mutex);
}

void father(int &sockfd)
{
    while(1)
    {
        srand(time(NULL));
        int ms = rand() % 2000 + 5000
        send(sockfd, DATA, strlen(DATA), 0);
        usleep(1000*ms);
        takef(sockfd);
        putf(sockfd);
    }
}

int main(int argc, char *argv[])
{
    /*
    *
    *
    *  *Other code*
    *
    *
    */
    father(sockfd);

    return 0;
}

或者,另一种选择,如下面提到的,是编写一个函数原型。这类似于如何在头文件中为函数编写原型,然后在.cpp文件中定义函数。函数原型是没有主体的函数,它让编译器知道函数存在但尚未定义。
下面是一个使用原型开发的示例

sem_t mutex;
sem_t S;
char buffer[1024];

void error(const char *msg)
{
    perror(msg);
    exit(0);
}

/*
    void signal_callback_handler()
    {
        close(sockfd);

    }

* /

// Prototypes
void takef(int &sockfd);
void testa(int &sockfd);
void putf(&sockfd);

void father(int &sockfd)
{
    while(1)
    {
        srand(time(NULL));
        int ms = rand() % 2000 + 5000
        send(sockfd, DATA, strlen(DATA), 0);
        usleep(1000*ms);
        takef(sockfd);
        putf(sockfd);
    }
}

void takef(int &sockfd)
{
    /*
    *
    *  *Other code*
    *
    *
    */
    testa(sockfd);

    /*  *Other code*
    *
    *
    */
}

void testa(int &sockfd)
{
    /*
    *
    *
    *  *Other code*
    *
    *
    */
}

void putf(&sockfd)
{
    /*
    *
    *
    *  *Other code*
    *
    *
    */
    test();
    test();
    sem_post(&mutex);
}

int main(int argc, char *argv[])
{
    /*
    *
    *
    *  *Other code*
    *
    *
    */
    father(sockfd);

    return 0;
}
bfnvny8b

bfnvny8b2#

在C++中,您需要在使用函数之前声明它们。在开始定义任何函数之前包括函数的原型。

相关问题