Программа на C заставляет меня возвращать тип, но он мне не нужен! - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть приложение TCP / IP на C. У меня есть 1 файл заголовка для обработки вещей, связанных с TCP / IP, и 1 основной файл для вызова всех функций.Так как проблема происходит на стороне клиента, я публикую только свой код на стороне клиента.

Вот файл program.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 (unsigned long long) в program.c

, но если я делаю это в 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.

- Почему это заставляет меня иметь возвращаемый тип int для функции waitForAMessageFromServerAndSendConfirmation (unsigned long long) в моем заголовочном файле

- Почему это заставляет меня возвращать типы int для всех функций, вызываемых после этой.

1 Ответ

0 голосов
/ 11 декабря 2018

Когда функция объявлена ​​как void, это означает, что функция не будет ничего возвращать.

Если вы используете оператор возврата со значением в такой функции, например, return 1;, вы пытаетесь получитьэто вернуть что-то.Но он определяется как , а не , чтобы что-то возвращать.

Объявление функции как 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;

говорит, что функция будет не возвращать что-либо, но вы пытаетесь позволить ей что-то вернуть.

из-за этих противоречий ваш компилятор жалуется.

...