В книге Страуструпа по PPP сказано, что мне следует добавлять #include "PPP.h"
в начале моих программ.
Итак, я захожу на сайт книги .
Где он перечисляет
Я не вижу реального объяснения того, как это реализовать.
И вот ошибки, которые я получаю из списка ошибок после попытки собрать это самостоятельно:
На «Как использовать модули?» ссылка, там лишь кратко упоминается, как включить использование модулей. Что я уже сделал:
При использовании Visual Studio.
Я уже провел тест, чтобы проверить, могу ли я использовать модули, и он прошел успешно, используя следующее в другом проекте:
// main.cpp
import test_module;
#include <iostream>
int main() {
int result = add(5, 3);
std::cout << "Result: " << result << std::endl;
return 0;
}
и
// test_module.ixx
export module test_module; // use this syntax
export int add(int a, int b) {
return a + b;
}
Программа, которую я пытаюсь построить на основе книги и которая не работает, структурирована следующим образом:
// ConsoleApplication1.cpp
#include "PPP.h"
int main()
{
cout << "This is simplified compared to the actual program\n";
}
// PPP.h
import PPP;
using namespace PPP;
using namespace std;
// disgusting macro hack to guarantee range checking for []:
#define vector Checked_vector
#define string Checked_string
#define span Checked_span
// PPP.ixx
export module PPP;
export import std;
#define PPP_EXPORT export
#include "PPP_support.h"
using namespace PPP;
тогда у меня тоже есть
// PPP_support.h
[...]
Какой код я получил по указанной ссылке PPP_support.h
Настройки моего проекта выглядят так: и это:
И это ошибки, которые я получаю из списка ошибок:
И из окна вывода:
Build started at 7:27 PM...
1>------ Build started: Project: ConsoleApplication1, Configuration: Debug x64 ------
1>Scanning sources for module dependencies...
1>Compiling...
1>PPP.ixx
1>C:\dev\ppp3\ConsoleApplication1\PPP_support.h(86,25): error C2182: 'simple_error': this use of 'void' is not valid
1>(compiling source file 'PPP.ixx')
1>C:\dev\ppp3\ConsoleApplication1\PPP_support.h(86,38): error C2065: 'string': undeclared identifier
1>(compiling source file 'PPP.ixx')
1>C:\dev\ppp3\ConsoleApplication1\PPP_support.h(86,45): error C2146: syntax error: missing ')' before identifier 's'
1>(compiling source file 'PPP.ixx')
1>C:\dev\ppp3\ConsoleApplication1\PPP_support.h(87,2): error C2143: syntax error: missing ';' before '{'
1>(compiling source file 'PPP.ixx')
1>C:\dev\ppp3\ConsoleApplication1\PPP_support.h(87,2): error C2447: '{': missing function header (old-style formal list?)
1>(compiling source file 'PPP.ixx')
1>Done building project "ConsoleApplication1.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
========== Build completed at 7:27 PM and took 00.407 seconds ==========
Я также пробовал не использовать модули (хотя думаю, это должно сработать, потому что мой небольшой тест модуля тестирования программы сработал) и использовать «заголовок «PPPheaders.h» на случай, если вам придется вернуться к использованию файлов заголовков». Но и это мне не удалось, потому что я думаю, что
#define PPP_EXPORT
#include "PPP_support.h"
возвращает меня к исходной точке.
Я очень надеюсь, что кто-нибудь сможет мне помочь. Я только что купил книгу на этой неделе с большим волнением и с нетерпением жду возможности изучить C++.
Я также читал некоторые другие форумы с вопросами по этому же вопросу, но не смог найти конкретного ответа. Единственное решение, которое я вижу на данный момент, — не использовать этот модуль/заголовок «поддержки», а просто import std;
или #include <iostream>
. Но там сказано, что использование этого рекомендуется для упражнений, описанных в книге более глубоко.
Большое спасибо!
стандарт отсутствует: //PPP_support.h
PPP_EXPORT inline void simple_error(std::string s) // write ``error: s'' and exit program (for non-exception terminating error handling)
{
std::cerr << "error: " << s << '\n';
exit(1);
}
проверьте разницу:
У него есть using namespace std;
@3CxEZiVlQ Где находится using namespace std;
в файле PPP_support?
Вы можете использовать «Поиск на этой странице» в своем браузере.
@3CxEZiVlQ Я не нашел. скриншот
Примечание: никогда не используйте
using namespace;
в файлах заголовков!