如何知道某些数据类型是不是来自 std?

Posted

技术标签:

【中文标题】如何知道某些数据类型是不是来自 std?【英文标题】:How to know if some data type is from std?如何知道某些数据类型是否来自 std? 【发布时间】:2021-12-29 16:30:32 【问题描述】:

std 命名空间中是否有任何类型列表?我正在编写从 uml 图到 C++ 代码的翻译器,它应该在需要时添加 std:: 。我的程序应该如何知道字符串有前缀 std:: 而 int 没有。

【问题讨论】:

为什么需要在解析器中添加这个?如果程序省略了命名空间前缀,则必须使用using namespace std,并且名称将在命名空间中找到。 对于一个用户定义类型为 vector 且也使用 std::vector 的程序,您将如何处理? en.cppreference.com/w/cpp/header 列出所有标准标头。您必须遍历所有这些才能获得它们定义的所有名称。 但添加 using namespace std 不是一个好习惯 严格来说,这不是解析器的工作。解析器获取 there 并构建语法树。确定是否以及在何处缺少 std:: 前缀将是执行语义分析的工作。 【参考方案1】:

std 命名空间中有类型列表吗?

标准中提到了所有这些,以及涵盖该标准的任何文档。但是,我知道没有简单的清单。

我的程序应该如何知道字符串有前缀 std:: 而 int 没有。

您的程序应该知道int 不在命名空间中,因为它是一个关键字。您可以在标准的 [tab:lex.key] 表中找到所有关键字的列表。

但是,仅仅因为标识符是string,并不意味着它在std 命名空间中。示例:

namespace not_std 
struct string ;
string s; // this isn't std::string


#include <string>
using std::string;
string s; // this is std::string

添加std:: 限定符仅在后一种情况下是正确的。


我正在编写从 uml 图到 C++ 代码的翻译器

在我看来,您的翻译人员应该将string 翻译成string 并将std::string 翻译成std::string。让图表的作者确保他们的名字是正确限定的。如果翻译者必须进行猜测,就会出现猜测错误的情况。

【讨论】:

[tab:lex.key] 正是我需要的,谢谢!

以上是关于如何知道某些数据类型是不是来自 std?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用接口从C ++中的模板强制通用数据类型?

推断 std::vector::back() 的返回类型

如何判断是不是存在SQL注入以及注入类型?

使用类作为数据类型时如何在 std::variant 中存储值?

来自 REST API 调用的 PowerBI XML 数据源有时会返回“表”数据类型

当类型不是 Integral 时,如何使用 std::atomic 执行基本操作?