假设我有一个函数,比如
void foo(const char* bar, ...)
它已经在多个地方被调用。
是否可以在main()
中收集编译时已知的所有静态字符串的地址
例如,foo("abc")
,我希望在main()
中能够获得"abc"
的地址。如果有人调用foo(someVariable)
,可能不知道someVariable
的地址,因此可以忽略它。
有可能吗?
发布于 2018-06-06 07:56:30
如果您同意使用注册,您可能会这样做
// 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;
}
}
https://stackoverflow.com/questions/50489239
复制相似问题