esms.cpp: 234: ошибка: ‘the_config’ не был объявлен в этой области

#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 был более мягким в предыдущей версии. Еще раз спасибо!!!