gpt4 book ai didi

c++ - 在编译时收集所有静态 C 字符串的地址

转载 作者:太空狗 更新时间:2023-10-29 12:09:34 24 4
gpt4 key购买 nike

假设我有一个类似的函数

void foo(const char* bar, ...)

而且它已经在多个地方被调用了。

是否可以在 main() 中收集编译时已知的所有静态字符串的地址?

比如foo("abc"),我希望在main()中能够得到"abc"的地址>。如果有人调用 foo(someVariable)someVariable 的地址可能是未知的,因此可以忽略它。

这可能吗?

最佳答案

如果您同意使用注册,您可以做类似的事情

// Would contain each registered string.
std::vector<const char*>& registered_vector()
{
static std::vector<const char*> v;
return v;
}

bool Register(const char* s)
{
registered_vector().push_back(s);
return true;
}

// Class which holds the unique pointer as buffer.
template <typename Char, Char... Cs>
struct static_string
{
static constexpr Char s[] = {Cs..., 0};
};

template <typename Char, Char... Cs>
constexpr Char static_string<Char, Cs...>::s[];

// string literal operator templates are a GNU extension
// MACRO can replace the operator to avoid that extension.
template <typename Char, Char... Cs>
static_string<Char, Cs...> operator ""_ss()
{
static_string<Char, Cs...> res;
static const bool dummy = Register(res.s); // Register only once :-)
static_cast<void>(dummy); // Avoid warning for unused variable
return res;
}

现在,测试它:

int main() {
"Hello"_ss;
"World"_ss;
"Hello"_ss;
"Hi"_ss;
"42"_ss;

for (const auto s : registered_vector()) {
std::cout << s << std::endl;
}
}

Demo

关于c++ - 在编译时收集所有静态 C 字符串的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50489239/

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