nat*_*evw 6 c unsigned signed casting typedef
如果我使用的库当前使用特定的数字类型别名,例如
\n\ntypedef uint32_t library_type;\n\nvoid library_function(library_type x);\nRun Code Online (Sandbox Code Playgroud)\n\n即使库更改了其 typedef,我如何确保需要传入不同类型的值的代码保持正确?
\n\nuint64_t x = get_some_number();\n\n// \xe2\x80\xa6need checks here\xe2\x80\xa6\n\nlibrary_function((library_type)x);\nRun Code Online (Sandbox Code Playgroud)\n\n我可以添加以下检查:
\n\nassert(sizeof library_type >= sizeof uint32_t);\nassert(x <= UINT32_MAX);\nRun Code Online (Sandbox Code Playgroud)\n\n第二次检查将确保我得到的值符合当前 的范围library_type。库作者没有提供LIBRARY_TYPE_MAX定义,因此第一个检查试图保护第二个,以防万一library_type将来编译代码时因任何原因发生更改。
第一次检查会捕获 if library_typewere 更改为 eg int8_t,但如果 thelibrary_type更改为 anint32_t该怎么办?它仍然是正确的“尺寸”,但范围仍然小于我正在检查的范围!
C 语言是否提供了一个运算符来内省类型的符号性,就像sizeof让我知道宽度一样?有没有其他方法可以确保library_type只有在正确的情况下才能达到我的演员表?
是的,关系运算符与强制转换运算符相结合。例如:
_Bool TYPE_is_signed = ((TYPE)-1 < 0);
Run Code Online (Sandbox Code Playgroud)
或者作为断言:
assert((TYPE)-1 < 0); // Require that TYPE is signed
assert((TYPE)-1 > 0); // Require that TYPE is unsigned
Run Code Online (Sandbox Code Playgroud)