Передача параметров для работы в другом файле (gcc) - PullRequest
0 голосов
/ 30 мая 2018

Я написал функцию добавления для int в Add.c.Затем я передал действительные числа этой функции добавления в Main.c.Коды показаны следующим образом.

Если у меня есть объявление функции add до ее вызова, ответ верен как 30. Однако, если объявление не существует, ответ неправильный.Зачем?

Add.c

int add(int x, int y) { return x + y;}

Main.c

#include<stdio.h>
int add(int, int); // If this does not exist, the answer is not 30.
int main(void) {
    printf("%d\n", add(10.5, 20.5));
}

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Чтобы это работало, прежде всего, вам нужно включить файл «add.c» в «main.c».Coz main.c не знает о функции «add» в add.c.(Также вам не следует создавать файл .c для добавления функции или чего-то еще. Вместо этого используйте «.h»)

Теперь решение должно выглядеть следующим образом ...

add.h

int add(int x, int y){
    return x + y;
}

main.c

#include<stdio.h>
#include "add.h"
int main(void){
    printf("%d\n", add(10, 20));
    return 0;
}

Убедитесь, что оба файла находятся в одном каталоге.

0 голосов
/ 30 мая 2018

Без объявления, которое более конкретно является прототипом (объявление с указанными типами параметров), вы полагаетесь на неявное объявление без прототипа функции (которая теперь является устаревшей функцией C).

Неявный прототип для функции f равен int f() - функция, возвращающая int и принимающая неопределенное количество параметров.

Способ вызова функций без прототипов - аргументы повышен (меньше чем int целочисленных типов до int и float с до double с) и передан функции определенным реализацией способом.Если аргументы не соответствуют определению, поведение не определено (ваш случай).

Вы можете исправить это (все еще полагаясь на неявное объявление), предоставив явное приведение:

#include<stdio.h>
//nothing (probably will get a compiler warning) or
int add(); /*=params unspecified*/ 
int main(void) {
    printf("%d\n", add((int)10.5, (int)20.5));
}

, тем самым удаляя UB (неопределенное поведение), или вы можете включить прототип, как у вас, что заставит компилятор преобразовывать переданные значения float s для соответствия ожидаемым типам (int).Другими словами, с прототипом компилятор вставит эти приведения для вас, видя, что преобразование из float в int в (аргумент) присваивания.

Предпочтительный способ решить это с помощьюпрототип, включенный через заголовок, который также включен в файл реализации (Add.c), чтобы позволить компилятору проверить вызов в соответствии с определением.

0 голосов
/ 30 мая 2018

Перед использованием add в Main.c необходимо знать объявление для этой функции.Без использования прототипа функции в этом случае поведение программы будет неопределенным.Вы можете добавить прототип до main, как вы это сделали, или вы можете создать отдельный файл Add.h и поместить туда прототип.
Во втором случае вам нужно добавить Add.h в оба файла .c.

Add.h

#ifndef ADD_H
#define ADD_H

int add(int x, int y;

#endif

Add.c

#include "Add.h"
int add(int x, int y) { return x + y;}

Main.c

#include<stdio.h>
#inclide "Add.h"

int main(void) {
    printf("%d\n", add(10, 20));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...