我在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'返回类型。
答案 0 :(得分:2)
将函数声明为void
时,表示该函数将不返回任何内容。
如果您在此类函数中使用带有值的return语句,例如return 1;
,您尝试使其返回某些内容。但这被定义为 not 不能返回某些内容。
将功能声明为void
有两个目的:
告诉函数用户不要期望返回值。
告诉函数的作者不要返回任何东西。如果作者想交流一些东西,他应该使用其他方式做到这一点(例如,使用指向指向调用方变量的指针参数来放置结果值,或者适应功能签名以返回某些东西)除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;
说该函数将不返回任何东西,但是您尝试让它返回一些东西。
由于这些矛盾,编译器会抱怨。