О ОШИБКЕ СОЗДАНИЯ ФАЙЛА ХАЙДЕРА В C ++

0

Я создаю файл заголовка для.cpp файла, где он будет содержать только объявление или прототип функции

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

 #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, где у меня определены функции add (,) и sub (,)

 #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, который указан как дополнение к переменной c в файле example.cpp.

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

  • 0
    Если вы используете include guard #define, я думаю, что нет смысла помещать в них #pragma once ...
  • 0
    но я читал в интернете, что использование #pragma позволит оптимизировать выполнение кода, что я добавил, вы хотите сказать, что я могу только писать, # ifndef #pragma ..endif, верно?
Показать ещё 1 комментарий
Теги:
visual-studio-2010

1 ответ

1
Лучший ответ

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

int s;

Вы должны иметь это в заголовке:

extern int s;

И затем в ровно один.cpp файл, обычно один с тем же именем базового файла, что и файл.h, вы должны иметь определение:

int s;

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

  • 0
    привет @ хайд, у меня сработало, спасибо
  • 0
    @ Сантош Круто. Здесь, в SO, когда вы получаете ответы, которые вас устраивают, вы помечаете наиболее понравившийся вам ответ как принятый (отметка в левом верхнем углу ответа). Это помечает вопрос как «решенный».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню