微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 MSVC 中将动态初始化的全局变量标记为“未使用时可丢弃”?

如何解决如何在 MSVC 中将动态初始化的全局变量标记为“未使用时可丢弃”?

我有一些像

这样的全局变量
FARPROC const f = GetProcAddress(...);

如果确定代码链接时未使用(例如 /Gy/OPT:REF),是否有任何方法可以促使编译器或链接器丢弃它们(以及相关的初始化代码)?

解决方法

我想通了。似乎 __declspec(selectany) 做到了这一点,即使没有通过 /Gw

举个例子,这个程序将只包含GetTickCount_

#include <Windows.h>

FARPROC GetTickCount_ =
    GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),"GetTickCount");

__declspec(selectany) FARPROC GetTickCount64_ =
    GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")),"GetTickCount64");

int main()
{
}
,

对于跨平台解决方案,请在模板类中使用 static 变量。如果未使用,即使初始化器有副作用,它们也会被丢弃。

示例:

#include <cstddef>
#include <iostream>

template <std::nullptr_t = nullptr>
struct A
{
    inline static const int value = []{
        std::ios_base::Init init;
        std::cout << "Hello,world!\n";
        return 42;
    }();
};

int main()
{
    // Nothing is printed,unless you uncomment following:
    // (void)A<>::value;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。