强制我具有返回类型的C程序,但我不需要它。

时间:2018-12-11 11:45:16

标签: c tcp pthreads posix

我在C中有一个TCP / IP应用程序。我有1个头文件用于处理TCP / IP相关的事情,还有1个主文件来调用所有功能。由于问题是在客户端发生的,因此我仅发布客户端代码。

这是程序。c

#include "tcpHeader.h"
#include <pthread.h>
#include <stdio.h>

int main(int argc, char **argv){

    // all code regarding connecting to server on TCP on another thread.
    // Join here after completing the thread execution
    // It works completely fine upto the next line.
    testFunctionFromMyHeader();

    // after executing below line, program do not continue with 'void' return type of the function. 
    // But it works if I change return type to 'int'
    waitForAMessageFromServerAndSendConfirmation(12345678901LL);

    // program expects me to return an integer on last function call 
    // & all other calls from now.
    // even if I don't need integer return type.
    testFunctionFromMyHeader();

    return 0;
}

这是tcpHeader.h

#ifndef CLIENT_TCP
#define CLIENT_TCP

// all required headers.
// all global variables

void testFunctionFromMyHeader(){
    printf("Test Function");
}

void waitForAMessageFromServerAndSendConfirmation(unsigned long long args){

    // wait until receiving data from server in recv() function.
    // received 'args' is used in processing the data.
    // process the data received
    // send the confirmation message to server in send() function.
    // Server also received this confirmation without any problem on server side.

    // all code in this function also worked properly.
    // Even the next printf line is also executed.
    printf("All operation completed.");

    // with 'void' return type, next line does not make any difference.
    // But if I return an 'int' then it works.
    return NULL;
}

#endif

它在程序中的waitForAMessageFromServerAndSendConfirmation(无符号长长)上停止。

但是如果我在program.c中这样做,它就可以工作。(从tcpHeader.h返回的函数类型也更改为适当的类型)

int confirmation = waitForAMessageFromServerAndSendConfirmation(12345678901LL);
if( confirmation == 0 ){ // 0 or any int value
    int testFunctionReturnedValue = testFunctionFromMyHeader();
        .
        .
        .
        // keep going like this with int return type FOR ALL FUNCTIONS
}

帮助我确定问题所在。我不想在所有地方都使用int返回类型。

-为什么它迫使我在头文件中的waitForAMessageFromServerAndSendConfirmation(unsigned long long)函数上使用“ int”返回类型

-为什么要强迫我在该函数之后调用的所有函数上使用'int'返回类型。

1 个答案:

答案 0 :(得分:2)

将函数声明为void时,表示该函数将不返回任何内容。

如果您在此类函数中使用带有值的return语句,例如return 1;,您尝试使其返回某些内容。但这被定义为 not 不能返回某些内容。

将功能声明为void有两个目的:

  1. 告诉函数用户不要期望返回值。

  2. 告诉函数的作者不要返回任何东西。如果作者想交流一些东西,他应该使用其他方式做到这一点(例如,使用指向指向调用方变量的指针参数来放置结果值,或者适应功能签名以返回某些东西)除void以外)。

例如:

void myFunc1(int*result) {
    *result= 1;  // put value 1 in callers variable
    // there is no return statement that returns a value
}
void myFunc2(int*result) {
    *result= 1;  // put value 1 in callers variable
     return;     // leave the function. There is no value to return.
}

或:

int myFunc(int in) {
    return 2*in;  // leave the function and return a value.
}


回到您的问题:

int confirmation = waitForAMessageFromServerAndSendConfirmation(12345678901LL);

上面说的是期望函数返回值并将其分配给变量conformation。但是,

void waitForAMessageFromServerAndSendConfirmation(unsigned long long args) {
    //....
    return NULL;

说该函数将返回任何东西,但是您尝试让它返回一些东西。

由于这些矛盾,编译器会抱怨。