gpt4 book ai didi

c++ - 如何在编译时标记默认参数的所有使用

转载 作者:行者123 更新时间:2023-11-30 01:35:49 25 4
gpt4 key购买 nike

我想找到所有使用构造函数的第二个默认参数的地方。签名看起来像这样:

enum Name {
NONE = 0,
BOB,
LARRY
};

MyClass(const std::string& p1, int id = 0, name = NONE)
: p1_(p1), id_(id), name_(name)
{ }

我有兴趣找到所有使用名称默认值的地方。即,所有未明确为名称提供值的调用站点。我不关心显式提供 NONE 的地方,只关心构造函数中未提供名称的地方。

这让我印象深刻,因为它应该在编译时被发现,因此,我可以使用编译器来提醒我。

我最初的想法是删除 NONE 作为默认值,编译并查看警告。但后来我意识到它之前的参数 id 有一个默认值,因此删除名称的默认 = NONE 将不会编译,因为你不能在参数之后没有默认值的参数。

我的第二次尝试是添加一个名为 DEFAULT_WAS_USED 的新 Name 枚举值,将其设置为默认值,并使用 static_assert 进行编译:

enum Name {
NONE = 0,
BOB,
LARRY,
DEFAULT_WAS_USED
};

MyClass(const std::string& p1, int id = 0, name = DEFAULT_WAS_USED)
: p1_(p1), id_(id), name_(name)
{
static_assert(name_ != DEFAULT_WAS_USED, "default name was used");
}

然而,虽然名称作为 DEFAULT_WAS_USED 的使用在编译时是严格已知的,因为我知道该值不会在代码中的任何地方使用并且只会用作默认参数,但编译器并不知道那是案例,无法编译。

有没有一种巧妙的方法让我使用编译器或链接器找到代码中所有使用默认参数的地方?

我正在使用 gcc 4.8。

最佳答案

如果您想找出使用​​name 默认值的地方,id 也有默认值并不重要:没有人会使用它除非他们还使用了 name 的默认值,无论如何你都想捕获这种情况。

因此,只需剥离两个默认值,然后看着火焰飞扬。

但是没有神奇的标志或开关可以精确/自动地执行您要求的具体操作,不。

关于c++ - 如何在编译时标记默认参数的所有使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53193727/

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