Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с областью видимости при линковании

25K
14 августа 2009 года
mukhiddin
5 / / 22.04.2007
Привет всем!
Работаю над проектом, в котором существует несколько папок (условно назовем их folder1, folder2....folder_n), в каждой из которых содержатся .h и .cpp файлы. Топ папку, которая содержит все папки назовем TOP_FOLDER. Внутри TOP_FOLDER я объявил open_file.h, в котором записан след. код:

#include "stdio.h"
#ifndef OpenFile_H
#define OpenFile_H
#define FILEPATH "FreeImageUsedFunctions.doc"
FILE *fd;
int ind;
#endif OpenFile_H

FILE *fd инициализурую в main.cpp (предназначен для ведения логов). Он находится внутри TOP_FOLDER.

В файлах, находящихся в TOP_FOLDER не возникает никаких проблем с определением fd после операци extern FILE *fd;. Однако при такой же операции в файлах, которые нах-ся в нижележащих папках folder1, folder2....folder_n возникает ошибка линкования.

Как мне решить эту проблему?
Заранее спасибо.
87
14 августа 2009 года
Kogrom
2.7K / / 02.02.2008
Хорошо бы посмотреть, как включается "open_file.h" в разные папки. Должно быть что-то типа:

В главной: #include "open_file.h"
folder1: #include "..\open_file.h"
folder2: #include "..\..\open_file.h"
...
Еще может со стражами включения какая-то ерунда.
Ну и лучше сделать так:
#endif // OpenFile_H
12K
14 августа 2009 года
Ghox
297 / / 26.07.2009
Цитата: mukhiddin
В файлах, находящихся в TOP_FOLDER не возникает никаких проблем с определением fd после операци extern FILE *fd;. Однако при такой же операции в файлах, которые нах-ся в нижележащих папках folder1, folder2....folder_n возникает ошибка линкования.


Думаю вам стоит написать, что за ошибка линкования у вас возникает (текст ошибки).

260
14 августа 2009 года
Ramon
1.1K / / 16.08.2003
Гадания на кофейной гуще проводят иные специалисты.

А здесь работают как минимум с кодом и сообщениями компилятора.
9
14 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Ramon

А здесь работают как минимум с кодом и сообщениями компилятора.


Неплохо бы указывать так же и IDE.

87
14 августа 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: Ramon
Гадания на кофейной гуще проводят иные специалисты.



Ну, мне в общем-то все равно - могу и на кофейной гуще погадать, дабы прокачать быдлокодерские и телепатские скиллы. Но автор темы получит правильный ответ быстрее, если приведет больше данных.

Кстати, придумал тему для холивара: "Нужны ли быдлокодерские скиллы?" Может как-нибудь создам в Общалке ;)

25K
15 августа 2009 года
mukhiddin
5 / / 22.04.2007
<TOP_FOLDER> open_file.h
|------------> folder1 (jdadm.cpp)
|------------> folder2

В файле jdadm.cpp:
#include "../OpenFile.h"(//нах-ся в TOP_FOLDER)

extern FILE *fd;(без extern а тоже ппобовал)

#ifdef DEBUG_MODE
fprintf(fd,"%d %s------------------%s\n\n",ind, __FUNCTION__ , __FILE__); //line 55
#endif

Запускаю проект - в результате появляется диагловое окно с надписью: Debug Assertion Failed
File: fprintf.c
Line: 55(nf строка где я записываю лог в файл)
Expression (str!=null)

код между ifdef и endif линкер видит, но определенны переменные fd и ind (в файле с функ-ем main() ) наверно считает как неопределенными
9
15 августа 2009 года
Lerkin
3.0K / / 25.03.2003
А линкер здесь при чём?
260
15 августа 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: mukhiddin
<TOP_FOLDER> open_file.h
|------------> folder1 (jdadm.cpp)
|------------> folder2

В файле jdadm.cpp:
#include "../OpenFile.h"(//нах-ся в TOP_FOLDER)

extern FILE *fd;(без extern а тоже ппобовал)

#ifdef DEBUG_MODE
fprintf(fd,"%d %s------------------%s\n\n",ind, __FUNCTION__ , __FILE__); //line 55
#endif

Запускаю проект - в результате появляется диагловое окно с надписью: Debug Assertion Failed
File: fprintf.c
Line: 55(nf строка где я записываю лог в файл)
Expression (str!=null)

код между ifdef и endif линкер видит, но определенны переменные fd и ind (в файле с функ-ем main() ) наверно считает как неопределенными



А нет ли у вас глобальных объектов некого класса в котором и зоветцо:

Цитата:

#ifdef DEBUG_MODE
fprintf(fd,"%d %s------------------%s\n\n",ind, __FUNCTION__ , __FILE__); //line 55
#endif



или даже не объектов, а достаточно инициализации неконстантным выражением глобальной переменной аля вызов ф-ции в которой тот же самый "логгинг".

PS: Ищу баги по фотографии. Дорого.

260
15 августа 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: Lerkin
А линкер здесь при чём?



Он во всем виноват:D

25K
17 августа 2009 года
mukhiddin
5 / / 22.04.2007
Цитата: Ramon
А нет ли у вас глобальных объектов некого класса в котором и зоветцо:



или даже не объектов, а достаточно инициализации неконстантным выражением глобальной переменной аля вызов ф-ции в которой тот же самый "логгинг".

PS: Ищу баги по фотографии. Дорого.



Извините RAMON я не совсем вас понял, что вы конкретно имеете ввиду, если можете приведите пожалуйста пример

260
29 августа 2009 года
Ramon
1.1K / / 16.08.2003
Код:
1.cpp
------------------------------
extern FILE* fd;

int xyz = foo();

int foo()
{
    fprint(fd, ...);

    return ...;
}

2.cpp
------------------------------
FILE* fd;

int main()
{
    fd = fopen(...);

    return 0;
}


и даже так

Код:
1.cpp
------------------------------
extern FILE* fd;

int xyz = foo();

int foo()
{
    fprint(fd, ...);

    return ...;
}

2.cpp
------------------------------
FILE* fd  = fopen(...);

int main()
{
    return 0;
}


Каково будет поведение у сего приложения?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог