【问题标题】:Why doesn't the vscode-cpptools extension provide intellisense for namespaced declarations inside macro definitions?为什么 vscode-cpptools 扩展不为宏定义内的命名空间声明提供智能感知?
【发布时间】:2023-02-12 00:12:50
【问题描述】:

我正在使用 VS 代码。以下所有描述都发生在 VS Code 环境中。

我得到了一个标头,其中定义了名称空间“Loki”,称为“Typelist.h”

我正在尝试在此标头中定义的命名空间内使用结构。

我做了:

# define LOKI_TYPELIST_1(T1) ::Loki::TypeList<T1, ::Loki::NullType>

# define LOKI_TYPELIST_2(T1, T2) ::Loki::TypeList<T1, LOKI_TYPELIST_1(T2)>

通常,我认为当我尝试键入 ::Loki::[Something from namespace Loki] 时它应该给我智能感知,但它没有显示任何内容。

甚至,当我在定义 LOKI_TYPELIST_2 时尝试使用 LOKI_TYPELIST_1 时,它也不起作用。

这里发生了什么?为什么 vscode-cpptools 扩展不为宏定义内的命名空间声明提供智能感知?

附言我确实在当前标题中包含了“Typelist.h”。

【问题讨论】:

  • 你为什么要为此使用#define
  • @NathanPierson 我正在定义类型列表的别名
  • 听起来像是using 的案例。
  • @NathanPierson 抱歉,'Loki' 已经是我的命名空间
  • 我说的不是using namespace Loki;,我是说template&lt;class T&gt; using LokiTypeList1 = ::Loki::TypeList&lt;T, ::Loki::NullType&gt;;。尽管如果您已经在 Loki 命名空间中,其中的一堆 Lokis 可能是多余的。

标签: c++ templates visual-studio-code macros namespaces


【解决方案1】:

据我所知,vscode-cpptools 不在宏定义中提供智能感知。

这实际上是相当合理的。当宏被使用时,宏定义的真正含义通常高度依赖于使用它的上下文。毕竟……这不是宏的主要功能之一吗?

举一个(不切实际的玩具)例子:#define FOO std::。比方说,当我触发 VS Code 在那里提供建议时,我希望看到在全局 std 命名空间内声明的事物的标识符。谁能说某些疯子不会重新定义 std 是什么然后使用 FOO

当然,如果它是 #define FOO ::std::,我们想象中的疯子就不走运了,但我敢打赌这是一个“区分宏体内已知的可保证内容的工作量太大,所以我们就不要在那里提供智能感知。

这里有更多(可能更好)的思考内容:智能感知如何知道什么在宏使用时在 std 命名空间内声明?这将取决于包含哪些标准标头以及在宏使用点之前进行了哪些前向声明。在一个使用站点,我可能包含了&lt;string&gt;,而在另一个站点,我可能没有包含它。等等 一个宏可以在多个地方使用。您如何为可以根据使用位置提供不同有效建议的东西提供智能感知?

即使有这么小的例子(还有许多不同的其他例子),已经有两个挑战使得 vscode-cpptools 扩展难以提供好的建议/自动完成。

授予 - vscode-cpptools 扩展可以并且将在宏中/内部显示问题突出显示(如果有)用法该宏的部分有问题,因为它使用编译器诊断消息来查找问题的“位置”,并且大多数编译器会在其诊断消息中报告发生问题的特定宏行和列(除了行和列之外正在使用宏的位置)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2016-12-07
    • 2012-02-27
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多