2014-02-12 3 views
0

Я создаю файл заголовок для CPP-файл, в котором она будет содержать только заявление или прототип функцииО Заголовочном файле СОЗДАНИЕ ОШИБКИ В C++

здесь является тройки программы я написал 1.header.h файл // где я объявившие функции добавления (,) и к югу (,)

#ifndef HEADER_H 
#define HEADER_H 
#pragma once 
int s; 
int add(int a,int b); 
int sub(int a,int b); 
#endif 

2.header.cpp, где я определил функции добавления (,) и к югу (,)

#include<iostream> 
#include "header.h" 
using namespace std; 


int add(int a,int b){ 
s=10; 
int c=a+b+s; 
return c; 
} 

int sub(int a,int b){ 
int c=a-b; 
return c; 
}  

3.example.cpp

 #include<iostream> 
    #include"header.h" 
    using namespace std; 
     void main(){ 

    int a=10,b=20; 

    int c=add(a,b); 
    int d=sub(c,a); 

    cout<<"c"<<c; 
    cout<<"d"<<d; 

    //cout<<s; 
    getchar(); 
     } 

здесь, я объявленная переменная 's' в header.h и определены в header.cpp файле, который определяется как дополнение к переменной с в example.cpp вывод файла.

он показывает ошибку header.obj: ошибка LNK2005: "Int S" (? S @@ 3HA) уже определен в example.obj Проекты \ заголовок \ Debug \ header.exe: фатальная ошибка LNK1169: один или более умножить определенные символы нашли пожалуйста, помогите мне решить эту ошибку, я работаю с давно за это ... заранее спасибо

+0

Если вы используете include guard #define, я думаю, что нет смысла помещать '#pragma once' внутри них ... – hyde

+0

, но я прочитал в Интернете, что использование #pragma будет использоваться для оптимизации выполнения кода, что добавлено yi , u означает, что я могу писать, # ifndef #pragma ..endif, правильно? – Santhosh

+0

Нет, '# ifndef' и' # define' идут вместе, как и у вас. «#pragma once» является нестандартизированной * альтернативой * к этому и может сократить время компиляции для некоторых компиляторов. Это никак не влияет на выполнение кода. Вероятно, вы должны поместить его вне [include guardings] (http://en.wikipedia.org/wiki/Include_guard) или вообще не использовать его. – hyde

ответ

1

Вы получаете сообщение об ошибке, потому что эта линия в .h уже определение:

int s; 

Необходимо иметь это в hea дер:

extern int s; 

А потом ровно один CPP-файл, как правило, один с таким же именем файла базы как .h файл, вам нужно иметь определение:

int s; 

Родственный: Вам не нужно ключевое слово extern с объявлениями функций, потому что это просто объявления, говорящие компилятору, что такая функция существует где-то, и вы можете делать это столько раз, сколько хотите. Но если вы помещаете глобальную (не , не inline) функцию определение{} функциональным телом вместо ;) в .h-файл, вы получаете аналогичную ошибку компоновщика о нескольких определениях.

+0

привет @ hyde, это сработало для меня, спасибо – Santhosh

+0

@Santhosh Cool. Здесь, в SO, как только вы получите ответы, вы удовлетворены, вы отмечаете ответ, который вам больше нравится, как принято (отметка в левом верхнем углу ответа). Это ставит вопрос как «решенный». – hyde

Смежные вопросы