Проблема с областью видимости при линковании
Работаю над проектом, в котором существует несколько папок (условно назовем их 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 возникает ошибка линкования.
Как мне решить эту проблему?
Заранее спасибо.
В главной: #include "open_file.h"
folder1: #include "..\open_file.h"
folder2: #include "..\..\open_file.h"
...
Еще может со стражами включения какая-то ерунда.
Ну и лучше сделать так:
#endif // OpenFile_H
Думаю вам стоит написать, что за ошибка линкования у вас возникает (текст ошибки).
А здесь работают как минимум с кодом и сообщениями компилятора.
А здесь работают как минимум с кодом и сообщениями компилятора.
Неплохо бы указывать так же и IDE.
Ну, мне в общем-то все равно - могу и на кофейной гуще погадать, дабы прокачать быдлокодерские и телепатские скиллы. Но автор темы получит правильный ответ быстрее, если приведет больше данных.
Кстати, придумал тему для холивара: "Нужны ли быдлокодерские скиллы?" Может как-нибудь создам в Общалке ;)
|------------> 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() ) наверно считает как неопределенными
|------------> 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: Ищу баги по фотографии. Дорого.
Он во всем виноват:D
или даже не объектов, а достаточно инициализации неконстантным выражением глобальной переменной аля вызов ф-ции в которой тот же самый "логгинг".
PS: Ищу баги по фотографии. Дорого.
Извините RAMON я не совсем вас понял, что вы конкретно имеете ввиду, если можете приведите пожалуйста пример
------------------------------
extern FILE* fd;
int xyz = foo();
int foo()
{
fprint(fd, ...);
return ...;
}
2.cpp
------------------------------
FILE* fd;
int main()
{
fd = fopen(...);
return 0;
}
и даже так
------------------------------
extern FILE* fd;
int xyz = foo();
int foo()
{
fprint(fd, ...);
return ...;
}
2.cpp
------------------------------
FILE* fd = fopen(...);
int main()
{
return 0;
}
Каково будет поведение у сего приложения?