c++ - C4838 警告与 const char* 数组的数组初始化

标签 c++ arrays char constants warnings

对于一个项目,我将我的着色器编译为二进制数据,然后将它们转换为头文件,该头文件将着色器的字节代码声明为 const char 数组。

但是,在编译期间我收到以下警告:

"conversion from int to const char requires a narrowing conversion".

现在我通常知道为什么会发生这种情况,这是因为编译器认为这些值是 int 类型,而实际上它们被声明为 char 类型。

const char base_ps[]={
0x44,0x58,0x42,0x43,0x12 ... etc

当鼠标悬停在这些值上时,IntelliSense 还会指出这些值被转换为 int。例如,对于索引 0 处的值,它列出了 (int)0x44

有什么解决办法吗?显然,我可以明确地将 (char) 放在每个值之前的任何位置,但是我必须为此在着色器生成中添加一个额外的步骤来解析头文件。

我也不想抑制警告,但我希望将警告视为错误。对此有何建议?

最佳答案

问题是因为您实际上使用的十六进制值太大而无法存储在 char 中(通常是带符号的 8 位长)。所以最大的正值是 127,或者 0x7F。您提供的值 like you show here包含超过 127 的值,因此您会收到正确的缩小转换警告。

要么使用 unsigned char 而不是 char,要么使用更小的数字(不大于 0x7F)like here :

const char deferred_ps[]={
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
};

请注意,如果忽略收缩转换警告,结果是实现定义的,不可移植。

关于c++ - C4838 警告与 const char* 数组的数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42904941/

相关文章:

c++ - 如何验证另一个程序的窗口是否最小化?

javascript - 从指定 Javascript 值的数组中删除元素

arrays - 如何在 Perl 中检查两个数组是否包含相同的元素?

java - 将 String.toCharArray() 放入 for 循环中是一个好习惯吗

c++ - char*(包含空值)到 std::string 知道长度

c++ - 成员函数返回指向成员函数的指针

c++ - 如何根据数组元素自动创建模板类的元组?

c++ - 转发非引用类型的引用

C++ 多维数组错误的多余代码

c++ - QT什么时候不允许一行多次转换,比如QString to char*