gpt4 book ai didi

c++ - 在 C++20 中混合模块和头文件是否可能/可接受?

转载 作者:行者123 更新时间:2023-12-03 10:05:15 25 4
gpt4 key购买 nike

我实际上是在尝试通过编写自己的小模块来理解 C++20 模块系统。假设我想提供一个函数来删除字符串开头和结尾的所有空格(trim 函数)。以下代码正常工作 .

module;

export module String;

import std.core;

export std::string delete_all_spaces(std::string const & string)
{
std::string copy { string };

auto first_non_space { std::find_if_not(std::begin(copy), std::end(copy), isspace) };
copy.erase(std::begin(copy), first_non_space);

std::reverse(std::begin(copy), std::end(copy));
first_non_space = std::find_if_not(std::begin(copy), std::end(copy), isspace);
copy.erase(std::begin(copy), first_non_space);
std::reverse(std::begin(copy), std::end(copy));

return copy;
}
import std.core;
import String;

int main()
{
std::cout << delete_all_spaces(" Hello World! \n");
return 0;
}
但是 如果我只想使用特定的 header 而不是 std.core 怎么办?在我的模块中? 如果我这样做,替换 import std.core通过以下代码,我在 Visual Studio 2019 上收到错误消息。
module;

#include <algorithm>
#include <cctype>
#include <string>

export module String;

// No more import of std.core

export std::string delete_all_spaces(std::string const & string)
{
// ...
}
Error LNK1179 file not valid or damaged: '??$_Deallocate@$07$0A@@std@@YAXPAXI@Z' COMDAT duplicated
但是,如果在 main.cpp我也替换了 import std.core#include <iostream> ,代码再次编译。就像 使用这两个系统证明链接器可以完成它的工作 .
问题是: 我做错了吗 ?同时使用新的 import 是一种不好的做法吗?和旧的 #include方法?我在 Internet 上的多个帖子中看到,您可以在模块中包含一些旧 header ,从而在不破坏现有代码的情况下更新您的代码。但是 如果此 header 包含 STL 的某些部分,例如 #include <string>,该怎么办? 但我的模块使用 import std.core ?
我只使用 Visual Studio 2019 进行测试,因为截至目前, import std.core不适用于 GCC。所以, 它可能来自 VS 中的一个错误 ? 还是所有编译器的问题都一样?

最佳答案

是的,模块可以与头文件一起使用。我们可以在同一个文件中导入和包含头文件,这是一个例子:

import <iostream>
#include <vector>
int main()
{
std::vector<int> v{1,6,8,7};
for (auto i:v)
std::cout<<i;
return 0;
}
创建模块时,您可以自由地在模块的接口(interface)文件中导出实体并将实现移动到其他文件。总而言之,逻辑与管理 .h 和 .cpp 文件的逻辑相同

关于c++ - 在 C++20 中混合模块和头文件是否可能/可接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65918405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com