Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / include context.h / 25 сообщений из 38, страница 1 из 2
17.05.2018, 22:29
    #39646398
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
Объясните пожалуйста

Создаю некий context.h

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
   #ifndef CONTEXT
   #define CONTEXT
   
    class context {
         public:
                 void run();
    } 

    void context::run() {

     }

   #endif CONTEXT



собираем получаем:

Undefined symbols for architecture x86_64:context::run referenced from:

В то же время если внести
void context::run() {

}

в cpp-шку - то все хорошо.

Ведь вначале h-ника стоит #ifndef
вроде #include должен имплементацию подключить ровно 1 раз

Спасибо.
...
Рейтинг: 0 / 0
17.05.2018, 23:56
    #39646430
blonduser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
semen.s.semen,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
   #ifndef CONTEXT
   #define CONTEXT
   
    class context {
         public:
                 void run(){;}
    } 
   #endif CONTEXT




Вот так надо.
...
Рейтинг: 0 / 0
17.05.2018, 23:59
    #39646432
blonduser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
semen.s.semen,

Точнее вот так
#ifndef CONTEXT
#define CONTEXT

class context {
public:
void run(){;}
} ; // забыл точку с запятой.
#endif CONTEXT
...
Рейтинг: 0 / 0
18.05.2018, 08:02
    #39646495
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
Это
Код: plaintext
1.
2.
3.
4.
5.
6.
   #ifndef CONTEXT
   #define CONTEXT
   
...

   #endif CONTEXT


можно заменить на
Код: plaintext
1.
#pragma once



По теме

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#pragma once
    class context {
         public:
                 void run() {
                   ...
                 }
    };
...
Рейтинг: 0 / 0
18.05.2018, 11:53
    #39646613
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
Спасибо за объяснение

Поясните плиз - почему мой вариант не работает

Хочу понять как работает сборщик
...
Рейтинг: 0 / 0
18.05.2018, 12:26
    #39646627
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
semen.s.semen
собираем получаем:

Undefined symbols for architecture x86_64:context::run referenced from:



Ты гонишь, другая ошибка должна быть.

Проблема в том, что ты определяешь одну и ту же функцию много раз, но не объявляешь её inline ни явно, ни неявно.
...
Рейтинг: 0 / 0
18.05.2018, 12:27
    #39646628
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
MasterZiv,

Ты опять торопишься.
...
Рейтинг: 0 / 0
18.05.2018, 12:28
    #39646629
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
semen.s.semenХочу понять как работает сборщик

Вряд ли ты поймёшь по этому примеру, тут скорее С++-заморочки, чем работа сборщика.

Грубо говоря, определение функции в нескольких объектниках/библиотеках запрещено по классике.
А вот в С++ есть послабление -- разрешены функции inline.
...
Рейтинг: 0 / 0
18.05.2018, 12:29
    #39646630
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
AmKadMasterZiv,

Ты опять торопишься.

В смысле?
...
Рейтинг: 0 / 0
18.05.2018, 12:30
    #39646631
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
MasterZiv, мне кажется. что у ТС точка с запятой пропущена 21419037

Но я редко на С пишу, т.ч. как компилятор воспринял код Т.С. - не знаю
...
Рейтинг: 0 / 0
18.05.2018, 12:30
    #39646632
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
Брррр

У меня объявление в 1 месте

Имплементация тоже в 1 месте

Просто оба они в 1 файле

Все работает если я имплементацию перекладываю в cpp - файл
...
Рейтинг: 0 / 0
18.05.2018, 12:31
    #39646633
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
semen.s.semenБрррр

У меня объявление в 1 месте

Имплементация тоже в 1 месте

Просто оба они в 1 файле

Все работает если я имплементацию перекладываю в cpp - файл

Нет, ты неправ. Подумай почему.
...
Рейтинг: 0 / 0
18.05.2018, 12:31
    #39646634
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
MasterZivТы гонишь, другая ошибка должна быть.


Я вчера кодил и получил такую ошибку

Имя класса только другое было

Сюда выложил измененное имя класса и метода

Принцип остался тот же
...
Рейтинг: 0 / 0
18.05.2018, 12:32
    #39646636
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
semen.s.semen,

Давай начнём с уточнения сообщения об ошибке.
авторUndefined symbols for architecture x86_64:context::run referenced from:
...
Рейтинг: 0 / 0
18.05.2018, 12:32
    #39646637
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
MasterZivНет, ты неправ. Подумай почему.

неправ в чем ?

Где 2-я декларация ? Где 2-я имплементация ?

Файл тоже 1
...
Рейтинг: 0 / 0
18.05.2018, 12:33
    #39646638
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
MasterZivsemen.s.semen,

Давай начнём с уточнения сообщения об ошибке.
авторUndefined symbols for architecture x86_64:context::run referenced from:

В оригинальной ошибке было

Undefined symbols for architecture x86_64

Дальше кракозябры внутри которых читались имена классов и методов
...
Рейтинг: 0 / 0
18.05.2018, 12:35
    #39646641
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
MasterZivAmKadMasterZiv,

Ты опять торопишься.

В смысле?Про пропущенную точку с запятой уже сказали. Поэтому с ней нижеприведенный вариант компилится. А то, что ты сказал про многократное определение ф-ии - просто поторопился.
context.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
   #ifndef CONTEXT
   #define CONTEXT
   
    class context {
         public:
                 void run();
    };

    void context::run() {

     }

   #endif CONTEXT

main.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#include "context.h"

int main() 
{
    context ctx;
    ctx.run();
}
...
Рейтинг: 0 / 0
18.05.2018, 12:40
    #39646645
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
semen.s.semen,

Проблема у тебя должна быть в том, что ты включаешь context.h в НЕСКОЛЬКО исходных файлов.
Тогда ошибка должна быть что-то типа

Код: plaintext
multiple definition of symbol void context::run

А не как у тебя где этот символ не определён вообще ни одного раза.

Другой вариант может быть, если ты бы не включил этот context.h ни в один исходный файл.
Тогда была бы такая ошибка, как ты привёл, но тогда и класс не был бы объявлен, использовать ты его не мог бы.

В любом случае, если проблему не решил, выкладывай код на https://hastebin.com/ или аналоги.
...
Рейтинг: 0 / 0
18.05.2018, 12:41
    #39646646
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
MasterZivПроблема у тебя должна быть в том, что ты включаешь context.h в НЕСКОЛЬКО исходных файлов.


Так ведь

#ifndef CONTEXT
#define CONTEXT


используется

Реально будет 1 инклуд
...
Рейтинг: 0 / 0
18.05.2018, 12:42
    #39646648
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
AmKadПро пропущенную точку с запятой уже сказали. Поэтому с ней нижеприведенный вариант компилится. А то, что ты сказал про многократное определение ф-ии - просто поторопился.

Очевидно, что точка с запятой у него уже там была, иначе бы он не дошёл до фазы сборки, компиляция бы дала ошибку.
...
Рейтинг: 0 / 0
18.05.2018, 12:43
    #39646650
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
MasterZivА не как у тебя где этот символ не определён вообще ни одного раза.


Все у меня определено

И все работает даже если context.h включен во многие исходники а имплементация лежит в отдельной cpp-шке
...
Рейтинг: 0 / 0
18.05.2018, 12:43
    #39646652
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
semen.s.semenMasterZivПроблема у тебя должна быть в том, что ты включаешь context.h в НЕСКОЛЬКО исходных файлов.


Так ведь

#ifndef CONTEXT
#define CONTEXT


используется

Реально будет 1 инклуд

Будет 1 инклуд, если ты включишь этот заголовок несколько раз в одном и том же исходном модуле .
Я говорю о включении его в РАЗНЫХ модулях.
...
Рейтинг: 0 / 0
18.05.2018, 12:44
    #39646653
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
MasterZivsemen.s.semenпропущено...


Так ведь

#ifndef CONTEXT
#define CONTEXT


используется

Реально будет 1 инклуд

Будет 1 инклуд, если ты включишь этот заголовок несколько раз в одном и том же исходном модуле .
Я говорю о включении его в РАЗНЫХ модулях.

Все работает даже если context.h включен во многие исходники а имплементация лежит в отдельной cpp-шке
...
Рейтинг: 0 / 0
18.05.2018, 12:44
    #39646655
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
semen.s.semenMasterZivА не как у тебя где этот символ не определён вообще ни одного раза.


Все у меня определено

И все работает даже если context.h включен во многие исходники а имплементация лежит в отдельной cpp-шке

Тогда давай код.
Домыслы твои выслушивать не интересно.
Ты говоришь одно, а на самом деле у тебя другое.
...
Рейтинг: 0 / 0
18.05.2018, 12:45
    #39646656
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include context.h
MasterZiv....
Очевидно, что точка с запятой у него уже там была, иначе бы он не дошёл до фазы сборки, компиляция бы дала ошибку.

кому очевидно, а кому и нет
ну и ни про среду, ни про параметры сборки ничего не сказано

может автор по отдельности компилятор и линковшик из командной строки или FAR запускает ))) Т.ч. наличие ошибки на фазе компиляции, не значит, что он не смог бы дойти до фазы сборки ))) и собирать банально какие нибудь старые файлы )))
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / include context.h / 25 сообщений из 38, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]