首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在编译时收集所有静态C字符串的地址

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

Stack Overflow用户
提问于 2018-05-23 21:06:30
回答 1查看 182关注 0票数 2

假设我有一个函数,比如

代码语言:javascript
复制
void foo(const char* bar, ...)

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

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

例如,foo("abc"),我希望在main()中能够获得"abc"的地址。如果有人调用foo(someVariable),可能不知道someVariable的地址,因此可以忽略它。

有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-06 07:56:30

如果您同意使用注册,您可能会这样做

代码语言:javascript
复制
// 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;
}

现在,测试它:

代码语言:javascript
复制
int main() {
    "Hello"_ss;
    "World"_ss;
    "Hello"_ss;
    "Hi"_ss;
    "42"_ss;

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

Demo

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50489239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档