Вы уже решили свою проблему в комментариях, поэтому я просто набираю ее, чтобы сделать правильный ответ.
Ваш оригинальный код был таким:
globals.h
extern std::string new_name;
other_file. cpp
#include "globals.h"
void func(std::string new_name) // <- shadows the global new_name
{
new_name += "_stuff";
}
main. cpp
#include "globals.h"
std::string new_name;
int main()
{
new_name = "bla";
func(new_name);
std::cout << new_name << std::endl;
return 0;
}
Здесь new_name
в main
не обновляется, и вывод bla
. Это происходит потому, что аргумент в func
скрывает глобальную переменную / extern.
Правильный способ использования extern
(если вы действительно хотите сохранить глобальный), это удалить аргумент func
:
globals.h
extern std::string new_name;
other_file. cpp
#include "globals.h"
void func()
{
new_name += "_stuff";
}
main. cpp
#include "globals.h"
std::string new_name;
int main()
{
new_name = "bla";
func();
std::cout << new_name << std::endl;
return 0;
}
Теперь затенение прошло, и на выходе получается bla_stuff
. Однако при этом используется глобальный тип, которого следует избегать, поскольку глобальность затрудняет рассуждение о том, где, когда и как обновляется переменная (поскольку к ней можно получить доступ буквально в любом месте программы).
Лучшее решение состоит в том, чтобы избавиться от глобального и вместо этого передать переменную, как первоначально, за исключением ссылки.
other_file. cpp
void func(std::string& new_name)
{
new_name += "_stuff";
}
main. cpp
int main()
{
std::string new_name = "bla";
func(new_name);
std::cout << new_name << std::endl;
return 0;
}
Теперь глобал исчез (как и файл globals.h
), и вывод по-прежнему bla_stuff
, как и предполагалось.