c++ - 如何在 gcc 或 clang 中启用从 int 到 int64_t 的转换警告

标签 c++ g++ clang

是否可以在 g++ 或 clang 中启用从 int 到 int64_t 的转换警告? 示例:

int n;
cin >> n;
int64_t power = (1 << n);

我希望编译器在第三行告诉我这个转换。

最佳答案

你可以在这些行上构建一些东西:

struct my_int64
{
    template<class Y> my_int64(const Y&)
    {
        static_assert(false, "can't do this");
    }
    template<> my_int64(const long long&) = default;
    /*ToDo - you need to hold the data member here, and 
      supply necessary conversion operators*/
};

然后

int n = 3;
my_int64 power = (1LL << n);

编译,但是

my_int64 power = (1 << n);

不会。从这个意义上说,这是一个很好的起点。您可以破解预处理器以使用它代替 int64_t

如果你想要一个警告而不是一个错误,你可以用

替换static_assert

my_int64 x{}; Y y = x; 并且希望编译器针对缩小转换发出警告,并相信它会优化这两个语句,因为它们共同为否-op.

关于c++ - 如何在 gcc 或 clang 中启用从 int 到 int64_t 的转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37214312/

相关文章:

c++ - C++ 中的 Json : Parse a number as a string to avoid floating-point inaccuracy

c++ - C++ 内存指针练习中的未知崩溃

c++ - QtCreator : `clang: invalid deployment target for -stdlib=libc++ (requires OS X 10.7 or later)`

c++ - 无法找到过程入口点

swift - 为 Swift 添加对 32 位 Ubuntu 的支持

c++ - 为什么 GCC 在 Clang 不使用它的地方插入 mfence?

c++ - 将数据从数组复制到 vector C++ C99

c++ - 如何使用模板根据类型将元素添加到各种容器

c++ - 为什么打印出字符 “” (147, 148 ascii) 在 C++ 上无法按预期工作?

linux - 为 power-pc 交叉编译 boost 库失败