Столкнулся с ошибкой средств компоновщика. Текст ошибки ссылается на CreateFile() в main.cc и вызов CreateFile() в Task5() practice5.cc (возможно я не правильно что-то понял, поэтому текст ошибки будет ниже). Предполагаю ошибка из-за подводных камней анонимного пространства имен.
main.h
#ifndef MAIN_H_
#define MAIN_H_
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
const int kIncorrectUserData = INT_MIN;
namespace main_functions {
string CreateFile();
double DoubleInput();
int IntegerInput();
} // namespace main_functions
#endif // MAIN_H_
main.cc
#include "main.h"
#include "marbles.h"
#include "practice4.h"
#include "practice5.h"
namespace main_functions {
string CreateFile() {
cout << "What do you want to name the text file?\n";
string filename, file_content;
cin >> filename;
ofstream file(filename + ".txt");
if (file.is_open()) {
cout << "What do you want to enter in file? Enter 'break!' separate line "
"for ending\n";
cin >> file_content;
while (file_content != "break!") {
file << file_content << "\r\n";
cin >> file_content;
}
file.close();
} else {
cout << "Program cannot open this txt file\n";
}
return filename + ".txt";
}
double DoubleInput() {
// ...
}
int IntegerInput() {
// ...
}
} // namespace main_functions
int main() {
// ...
}
practice5.h
#ifndef PRACTICE5_PRACTICE5_H_
#define PRACTICE5_PRACTICE5_H_
#include <cmath>
#include <fstream>
#include <limits>
#include "main.h"
namespace practice5 {
void Practice5Run();
}
#endif // PRACTICE5_PRACTICE5_H_
practice5.cc
#include "practice5.h"
namespace inner {
void swap(int* a, int* b) {
// ...
}
} // namespace inner
namespace {
int EuclideanAlgorithmByDivision(int first_number, int second_number) {
// ...
}
int EuclideanAlgorithmBySubtraction(int first_number, int second_number) {
// ...
}
void Task1() {
// ...
}
int* EratosthenesSieve(int i, int consistency_integers_size,
int* consistency_integers) {
// ...
}
void Task2() {
// ...
}
void Task3() {
// ...
void Task4() {
// ...
}
// AI automaticly-generated functions
int partition(int arr[], int low, int high) {
// ...
}
void quickSort(int arr[], int low, int high) {
// ...
}
// Ending AI auto-generated functions
void DrawingTableInFile(ofstream& fout, string** array, const int kRowsCount,
const int kColumnsCount) {
// ...
}
void ReverseArray(int arr[], int starting_element, int ending_element) {
// ...
}
void Task5() {
cout << "Enter task number: '9' or '23'\n";
int task_number;
task_number = main_functions::IntegerInput();
switch (task_number) {
case 9: {
const int kFilesCount = 2;
ofstream fin("C.txt");
for (int file_number = 0; file_number < kFilesCount; file_number++) {
ifstream fout(main_functions::CreateFile());
if (fout.is_open() and fin.is_open()) {
const int kArraySize = 1000;
int* array = new int[kArraySize];
array[0] = kArraySize;
InitializingArray(fout, array, 1);
quickSort(array, 1, array[0] - 1);
for (int i = 1; i < array[0]; i++) fin << to_string(array[i]) << " ";
delete[] array;
fout.close();
} else {
cout << "Program cannot open this txt files\n";
break;
}
}
fin.close();
ifstream fout("C.txt");
if (fout.is_open()) {
string file_content;
while (getline(fout, file_content)) cout << file_content;
fout.close();
fstream clear_file("C.txt", ios::out);
clear_file.close();
} else {
cout << "Program cannot open this txt file\n";
}
} break;
case 23: {
// ...
} break;
default:
cout << "Incorrect task number\n";
}
}
} // namespace
namespace practice5 {
void Practice5Run() {
int command = 1;
while (command != 0) {
cout << "Enter task number separate digit or '0' for exit\n";
command = main_functions::IntegerInput();
if (command == 1)
Task1();
else if (command == 2)
Task2();
else if (command == 3)
Task3();
else if (command == 4)
Task4();
else if (command == 5)
Task5();
else if (command == 0)
break;
else
cout << "Wrong command.\n";
}
}
} // namespace practice5
Процесс сборки:
1>main.cc
1>marbles.cc
1>practice4.cc
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(153,54): warning C4244: аргумент: преобразование "double" в "const unsigned __int64", возможна потеря данных
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(373,31): warning C4002: слишком много аргументов для вызова макроса, подобного функции, "max"
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(375,40): warning C4002: слишком много аргументов для вызова макроса, подобного функции, "min"
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(377,44): warning C4002: слишком много аргументов для вызова макроса, подобного функции, "max"
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(379,44): warning C4002: слишком много аргументов для вызова макроса, подобного функции, "min"
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(389,14): warning C4267: инициализация: преобразование из "size_t" в "int"; возможна потеря данных
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(390,59): warning C4244: +=: преобразование "double" в "int", возможна потеря данных
1>practice5.cc
1>practice6.cc
1>Создание кода...
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(357): warning C4715: `anonymous namespace'::GetVendor: значение возвращается не при всех путях выполнения
1>practice5.obj : error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl main_functions::CreateFile(void)" (?CreateFile@main_functions@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) в функции "void __cdecl `anonymous namespace'::Task3(void)" (?Task3@?A0x850a01fe@@YAXXZ).
1>C:\Users\mag1s\Source\Repos\MIREA\x64\Debug\Procedural programming.exe : fatal error LNK1120: неразрешенных внешних элементов: 1
1>Сборка проекта "Procedural programming.vcxproj" завершена с ошибкой.
UPD: Ссылка на неразрешенный внешний символ (возможные причины) Не дает мне ответа на вопрос, т.к. в коде не используются сторонние библиотеки, у CreateFile() есть объявление, файлы с кодом комплилруются, в нем нет классов и присутствует внешнее связывание.
main.ccв сборке участия не принимал вообще. – user7860670 Mar 02 '24 at 10:03Task3, которого в вопросе не видно. Ну а раз помогло изменение идентификаторов, то вероятно, что в каком-то из них было что-то не так, например присутствовал непечатаемый символ или еще какие-нибудь атавизмы копипасты. Еще кстати обязательно следует исправить C4715. – user7860670 Mar 02 '24 at 11:32