如何知道某些数据类型是不是来自 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?的主要内容,如果未能解决你的问题,请参考以下文章
使用类作为数据类型时如何在 std::variant 中存储值?