2013-11-30 7 views
0

У меня есть два файла .cpp, один из которых называется practice.cpp, а другой - adder.cpp. они находятся внутри папки «Исходные файлы».Как вы используете функцию внутри другой функции?

код кулачки показан ниже:

// adder.cpp 

#include "stdafx.h" //include library 


int addition(int a, int b) //start function 
{ 
    int r = 0; //declare variables 
    r = a + b; //actual code 
    return r; //output of function 
} 

Второй код:

// Practice.cpp 

#include "stdafx.h" 
#include "adder.cpp" 
#include <iostream> 
using namespace std; 


int main(void) 
{ 
    int number1 = 0; 
    int number2 = 0; 
    int number3 = 0; 

    do 
    { 
     printf("\n\nInsert value for first number\n\n"); 
     scanf("%d",&number1); 

     printf("\nthe value "); 
     printf("%d ",number1); 
     printf("has been stored in memory location "); 
     printf("%d",&number1); 

     printf("\n\nInsert value for second number\n\n"); 
     scanf("%d",&number2); 

     printf("\nthe value "); 
     printf("%d ",number2); 
     printf("has been stored in memory location "); 
     printf("%d",&number2); 

     number3 = addition(number1,number2); 

     printf("%d",number3); 



    } 
    while (1==1); 

    return 0; 
} 

Но код не скомпилируется. Я получаю сообщение об ошибке:

1>------ Build started: Project: Practice, Configuration: Debug Win32 ------ 
1> Practice.cpp 
1>c:\users\craig\documents\3rd year work\progamable  systems\practice\practice\practice.cpp(25): warning C4996: 'scanf': This function or  variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use  _CRT_SECURE_NO_WARNINGS. See online help for details. 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(304)  : see declaration of 'scanf' 
1>c:\users\craig\documents\3rd year work\progamable  systems\practice\practice\practice.cpp(33): warning C4996: 'scanf': This function or  variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use  _CRT_SECURE_NO_WARNINGS. See online help for details. 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(304)  : see declaration of 'scanf' 
1>Practice.obj : error LNK2005: "int __cdecl addition(int,int)" ([email protected]@[email protected])  already defined in adder.obj 
1>C:\Users\Craig\Documents\3rd year work\Progamable Systems\Practice\Debug\Practice.exe  : fatal error LNK1169: one or more multiply defined symbols found 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Я смотрел по всему Интернету, но похоже, что я делаю это правильно. Что я могу сделать, чтобы исправить это? Благодаря!

+5

Не включайте CPP файлы. – chris

+0

«уже определен в adder.obj» сообщает вам, что вы дважды определили функцию, что нарушает ODR. –

+0

@ user34248 не могли бы вы отметить любой ответ в качестве правильного ответа? :) –

ответ

3

Не включайте файлы .cpp, поэтому компилятор сообщает вам о нескольких определениях. Вы должны создать заголовок .h файл и включить его в двух ваших файлах .cpp и поместить следующее:

// adder.h 

#ifndef ADDER_H 
#define ADDER_H 

int addition(int, int); 

#endif 

Это препроцессор предложение будет сказать компилятору определить только один раз метода addition. Это работает, удачи :)

+0

Я отредактировал свой ответ :) –

2

Когда вы #include adder.cpp, весь код из этого файла будет скопирован в это место. Следовательно, вы получаете 2 определения функции addition.

Именно поэтому рекомендуется не включать файлы cpp, но файлы заголовков с включенными защитными устройствами.

+0

Спасибо за ответ, но где два определения добавления? Я определяю его в файле adder.cpp, но я использую его только в файле practice.cpp. Он определяется один раз и используется один раз. Или я смущаюсь? Можете ли вы объяснить, как я определил его дважды? Спасибо! – Blue7

+0

Как я уже сказал в своем ответе, когда вы включаете файл, это то же самое, что и написать точный код adder.cpp на практике. Cpp. следовательно, определение функции добавления теперь эффективно появляется в обоих файлах. Вот почему компоновщик жалуется. –

+0

@ user34248 Скомпилированы два файла: adder.cpp и Practice.cpp, мы называем эти единицы компиляции файлов. Эти две независимые единицы компиляции теперь имеют каждое определение 'addition()'. В конце концов, все единицы компиляции соединяются вместе. Когда компоновщик теперь пытается связать ваш проект, он будет говорить, что есть два определения функции 'addition()', как это происходит в adder.cpp, а также в Practice.cpp – Paranaix

0

Удалить #include "adder.cpp" и просто использовать вперед декларацию до главной функции:

int addition(int a, int b); 
Смежные вопросы