#c #scope #friend
#c #область #друг
Вопрос:
Я пытаюсь скомпилировать некоторые cpp-файлы из старого проекта с открытым исходным кодом, у которого больше нет сообщества поддержки. В проекте около 15 .cpp-файлов, и некоторые из них используют один общий файл, называемый config.cpp. Я компилирую исходный код c , используя файл make, который запускает команду, подобную этой:
g -g -c -Wall -pedantic -ansi esms.cpp
Однако это выдает мне несколько ошибок, подобных этой: esms.cpp: 234: ошибка: ‘the_config’ не был объявлен в этой области
Я проверил esms.cpp файл, содержащий следующее, включает:
#include "game.h"
#include "config.h"
#include "tactics.h"
#include "report_event.h"
#include "teamsheet_reader.h"
#include "cond.h"
#include "util.h"
#include "mt.h"
#include "anyoption.h"
#include "cond_utils.h"
#include "config.h"
#include "comment.h"
Я также проверил файл config.h и нашел в файле следующее:
class config
{
public:
void load_config_file(string filename);
string get_config_value(string key);
void set_config_value(string key, string value);
int get_int_config(string key, int dflt);
friend configamp; the_config(void);
private:
config()
{}
config(const configamp; rhs);
configamp; operator= (const configamp; rhs);
map<string, string> config_map;
};
Затем я проверил config.cpp файл и нашел объявление для the_config:
#include <cstdio>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <cctype>
#include "config.h"
#include "util.h"
// get a reference to a static config (a singleton)
configamp; the_config(void)
{
static config tcfg;
return tcfg;
}
Таким образом, «the_config», по-видимому, определен в config.h и config.cpp файлы, но по какой-то причине esms.cpp файл не думает, что это объявлено. Я попытался переместить метод в esms.cpp файл и удаление его из config.cpp файл, но затем другие cpp-файлы, которые зависят от config.cpp файл начал выдавать ошибки.
Как мне сделать так, чтобы esms.cpp файл распознает, что «the_config» определен в config.cpp чтобы исправить ошибку области видимости?
Спасибо за вашу помощь! Я надеюсь, что этот вопрос имеет смысл, я только начинаю работать с C
Ответ №1:
Функция the_config
на самом деле не объявлена в config.h
. Без объявления esms.cpp
не знает, что the_config
такое, поэтому компилятор генерирует ошибку.
У вас действительно есть объявление друга the_config
внутри config
определения класса, но это объявление друга не приводит к «нормальному» объявлению the_config
. Приведенное выше объявление friend the_config
просто ссылается на функцию из охватывающей области (в данном случае глобальной области), но оно не вводит объявление в глобальную область.
Вам нужно сделать это объявление явно, т. Е. вы должны добавить
configamp; the_config(void);
вне определения класса в config.h
.
Как мне заставить
esms.cpp
файл распознать, что «the_config» определен вconfig.cpp
Вы не можете. Компилятор C (в узком смысле этого термина, т.е. «компилятор» в отличие от «компоновщика») видит каждую единицу перевода независимо, что означает, что esms.cpp
не знает и не заботится о config.cpp
. Единственный способ esms.cpp
узнать об the_config
этом — ввести объявление the_config
в esms.cpp
. Обычно это делается с помощью файла заголовка. В вашем случае это было бы config.h
. Вам нужно исправить свой config.h
, как показано выше.
Комментарии:
1. Спасибо, Андрей! Ваш ответ правильный. Вы не представляете, как я ценю вашу помощь. Интересно, как это работало до этого изменения, возможно, g был более мягким в предыдущей версии. Еще раз спасибо!!!