• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

First Defind here...

Object Storage Arubacloud
0 głosów
157 wizyt
pytanie zadane 16 października 2015 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)

Mam 5 plików w projekcie, 2 nagłówkowe + main.cpp. Oto ich "include":
main.cpp:
 

#include <iostream>
#include "f_pomocnicze.h"

f_pomocnicze.cpp:
 

#include <iostream>
#include "f_pomocnicze.h"
#include <gotoxy.h>
#include <windows.h>
#include <conio.h>

logowanie.cpp:
 

#include "f_pomocnicze.h"
#include "logowanie.h"
#include <iostream>
#include <gotoxy.h>
#include <conio.h>
#include <windows.h>
#include <fstream>

Kompilator czepia sie gotoxy.h, a dokładnie "multiple definition of...". Nie wiem jak poradzic sobie z tym problemem. 

W plikach nagłówkowych nie ma nic zaincludowane.

3 odpowiedzi

+1 głos
odpowiedź 16 października 2015 przez criss Mędrzec (172,590 p.)

Na początku plików nagłówkowych dodaj #pragma once. Albo nawet lepiej tak: 

//plik header.h

#ifndef HEADER_H
#define HEADER_H

//kod

#endif

Nie wszystkie kompilatory obsługują pragma once.

U ciebie błąd się pojawia, bo kompilator dołącza *.h kilka razy. Te dyrektywy temu zapobiegają.

komentarz 16 października 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)
No tak, tylko że tutaj chodzi o "gotoxy.h", w którym umieściłem już "#ifndef". Nie działa, nadal jest "multiple definition".
komentarz 16 października 2015 przez furas Maniak (53,800 p.)
Może pokaż "gotoxy.h" oraz wszystkie miejsca gdzie występuje gotoxy.
komentarz 16 października 2015 przez criss Mędrzec (172,590 p.)
Najlepiej pokaż przynajmniej te *.h, obydwa.
komentarz 16 października 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)

Pliki .h nie mają nic oprócz nagłówków funkcji.

komentarz 16 października 2015 przez criss Mędrzec (172,590 p.)
No to normalne, pokażesz je?
komentarz 16 października 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)
void interfejs();
void wyczysc();
void logo();

i
 

void logowanie();
void rejestracja();

Ale nie rozumiem, co to moze pomoc 

0 głosów
odpowiedź 16 października 2015 przez furas Maniak (53,800 p.)

Zawsze podawaj pełny komunikat o błędzie bo z niego często łatwiej odczytać problem niż z próbu opisania co w tym komunikacie jest podane.

A czy ten gotoxy.h sam stworzyłeś czy to jakaś część biblioteki ?

A może tam jest mowa o gotoxy a nie gotoxy.h ? Może masz gdzieś zdefiniowaną własną funkcję gotoxy, która koliduje z już istniejącą inną funkcją gotoxy.

komentarz 16 października 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)

Dodałem taką funkcję do głównych programu, treść:
 

#ifndef gotoxy_h
#define gotoxy_h
#include <windows.h>
void gotoxy(int x, int y)
{
     COORD c;
     c.X = x-1;
     c.Y = y-1;
     SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), c);
}

#endif // gotoxy

Błąd: 

(jeśli nie widać: "Line: 5 | multiple definition of 'gotoxy(int, int)'"  "Line: 5 | first defined here" 

komentarz 16 października 2015 przez furas Maniak (53,800 p.)
W tym komunikacie jest chyba nazwa pliku, w którym jest drugi raz zdefiniowane oraz "first defined here" czyli gdzie zostało zdefiniowane po raz pierwszy. Sprawdź oba pliki.
komentarz 16 października 2015 przez furas Maniak (53,800 p.)
#ifndef zapobiega dołączeniu drugi raz tego samego pliku ale nie zapobiega problemowi gdy `gotoxy(x,y)` będzie zdefiniowane w dwóch różnych plikach.
komentarz 16 października 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)
Nie, pisze "In function "Z6gotoxyii"", przeczytalem ze moze byc to przez to, ze jest delkarowana kilka razy w programie (czy coś takiego)
komentarz 16 października 2015 przez furas Maniak (53,800 p.)
Masz tam też kolumnę "File" - tam zobacz na nazwy plików.
komentarz 16 października 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)
...i jak już pisałem, błędy tyczą się "gotoxy.h"
komentarz 16 października 2015 przez furas Maniak (53,800 p.)
Na zdjęciu wygląda, że pierwsze wystąpienie było w "f_po" - może chodzi o "f_pomocnicze".

Może tam jest druga definicja gotoxy(x,y)

Jeśli IDE ma takie możliwości to zawsze można kazać mu wyszukac we wszystich plikach "gotoxy(" . Niech szuka z nawiasem aby szukało funkcji a nie czegoś innego, ale bez parametrów gdyby się okazało, że jest druga funkcja z innymi parametrami.
0 głosów
odpowiedź 16 października 2015 przez draghan VIP (106,230 p.)

Dodałem taką funkcję do głównych programu, treść:
 

1

2

3

4

5

6

7

8

9

10

11

12

#ifndef gotoxy_h

#define gotoxy_h

#include <windows.h>

void gotoxy(int x, int y)

{

     COORD c;

     c.X = x-1;

     c.Y = y-1;

     SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), c);

}

 

#endif // gotoxy

Och, skąd ja znam ten kod...? ;) Pisałem Ci, że musisz zdefiniować tę funkcję jako inline. W pliku nagłówkowym nie może być zdefiniowana zwykła funkcja, bo w każdym miejscu jej dołączenia dostaniesz jej nową definicję, na co kompilator nie pozwoli. Ale jeśli kod będzie wyglądał tak:

#ifndef gotoxy_h

#define gotoxy_h

#include <windows.h>

inline void gotoxy(int x, int y)
{

     COORD c;

     c.X = x-1;

     c.Y = y-1;

     SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), c);
}


#endif // gotoxy

..to powinno załatwić sprawę. Funkcje inline są rozwijane w miejscu wywołania, t.j. nie są wywoływane jak normalne funkcje, tylko w kod programu wstawiany jest explicite kod takich funkcji. Te funkcje mogą (a nawet jest wskazane) być zdefiniowane w plikach nagłówkowych.

komentarz 16 października 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)
No nie działa. Ja już nie wiem. Jak dojdziecie z tym do ładu to stawiam kufel wirtualnego piwa.
http://www.mediafire.com/download/qitk82f8vsmbm1j/Andromeda.rar
Jedyne co trzeba zrobić to dodać "gotoxy.h".
komentarz 16 października 2015 przez draghan VIP (106,230 p.)
Oprócz dodania inline do gotoxy(), wpisz w KAŻDYM SWOIM NAGŁÓWKU dyrektywy ograniczające wielokrotne dołączanie (albo technika guardów [#ifndef blablabla...] albo #pragma once). Powinno pójść. ;)
komentarz 17 października 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)

Nadal czepia sie gotoxy, teraz że niby nie wie co to są COORD i te inne:

komentarz 17 października 2015 przez draghan VIP (106,230 p.)

Chyba wyrzuciłeś z pliku gotoxy.h include'a z windows.h.

Proszę, u mnie działa bez zarzutu:
http://vpx.pl/i/2015/10/17/andromeda.png

Oto pliki:
http://przeklej.org/file/jWsAZr/Andromeda.rar

A tak wygląda gotoxy.h, wrzucony do głównego katalogu include:
 

#pragma once
#include <windows.h>

inline void gotoxy(int x, int y)
{
     COORD c;
     c.X = x-1;
     c.Y = y-1;
     SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), c);
}

A co do nieużywania #pragma once na rzecz techniki strażników, to się nie zgodzę. Owszem, starsze kompilatory nie rozpoznają tej dyrektywy. Ale spora większość obecnie liczących się na rynku kompilatorów wspiera to rozwiązanie, które jest krótsze i bardziej eleganckie niż include guard.
https://en.wikipedia.org/wiki/Pragma_once#Portability

komentarz 17 października 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)

Dziękować, kolego :D

Podobne pytania

0 głosów
3 odpowiedzi 649 wizyt
pytanie zadane 17 kwietnia 2017 w C i C++ przez Krzychu234 Początkujący (350 p.)
0 głosów
1 odpowiedź 403 wizyt
pytanie zadane 25 lipca 2016 w C i C++ przez Bot Użytkownik (760 p.)
0 głosów
2 odpowiedzi 193 wizyt

92,617 zapytań

141,467 odpowiedzi

319,783 komentarzy

61,999 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...