LINUX.ORG.RU

GCC, #define, #ifndef. Непонятное поведение


0

0

Всем привет! Не могу разобраться в ситуации:
Есть
::::::::::::::
1.hpp
::::::::::::::
#ifndef X1
#define X1

void f() { return;}

#endif
::::::::::::::
1.cpp
::::::::::::::
#include "1.hpp"

::::::::::::::
main.cpp
::::::::::::::
#include "1.hpp"

int main()
{
}

Делаю: $ g++ main.cpp 1.cpp
Выдача:

/tmp/ccn0Pw3d.o: In function `f()':
1.cpp:(.text+0x0): multiple definition of `f()'
/tmp/ccmDTWkb.o:main.cpp:(.text+0x0): first defined here
collect2: ld returned 1 exit status

В чем ошибка, хоть убей не пойму[может спать пора уже, 3-и сутки "на ногах"]
anonymous

ну вообще то линкер англицким языком молвит мол хозяин, я увидел два публичных символа с одинаковым именем и не знаю, какой из них использовать. что тут такого?

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

То, что линковщик сказал мне понятно, спасибо. Не понятно: как подобные вещи компилить и что конкретно не корректно в моем примере.

anonymous
()
Ответ на: комментарий от anonymous

> То, что линковщик сказал мне понятно, спасибо. Не понятно: как подобные вещи компилить и что конкретно не корректно в моем примере.

а что именно вы хотите сделать?

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

А вот теперь я понял свою ошибку. В реальной ситуации, в отличие от приведенной, у меня в .hpp объявлен и реализован метод класса, я забыл указать для него inline спецификатор ;(

Хотя, всеже немного не понятно. Разве #define распространяется лишь на 1 модуль компиляции? Почему при первой замене заголовочного файла не определяется define-поле, а при повторной попытке подстановки этого заголовочника, подстановка не происходила бы?

Спасибо, прошу извинить за столь глупую ветку.

anonymous
()
Ответ на: комментарий от anonymous

g++ main.cpp 1.cpp это упрощённая запись трёх команд:
g++ -o main.o main.cpp
g++ -o 1.o 1.cpp
ld {куча С и С++ библиотек и опций} -o main main.o 1.o

естественно, для каждого модуля дефайны вычисляются заново.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

>у меня в .hpp объявлен и реализован метод класса

как реализован? внутри определения класса или вне?

generatorglukoff ★★
()
Ответ на: комментарий от anonymous

>>Разве #define распространяется лишь на 1 модуль компиляции?

естественно

alex_custov ★★★★★
()

Чтобы заголовки не инклюдились дважды делают так:

#ifndef _HEADER_H_
#define _HEADER_H_

//your code here

#endif

Однако ты сделал ещё круче - объявил функцию внутри хедера.
Так не делают, в хедерах только прототипы пихают.

true_admin ★★★★★
()
Ответ на: комментарий от anonymous

> Разве #define распространяется лишь на 1 модуль компиляции?

Разумеется

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.