我们正在开发有关嵌入式Linux与C和C ++的项目。 我最近在函数中遇到了一个奇怪的语句:
bool StrangeFunction(void* arg1, void* arg2, void* arg3)
{
(void)arg1;
(void)arg2;
(void)arg3;
unsigned long keycode = (unsigned long)arg2;
switch(keycode)
{
...
我在上面的代码中有两个问题
(void)arg1;
是什么意思?unsigned long keycode = (unsigned long)arg2;
如果您不介意,我需要一些解释和相关链接来解释主题。 感谢。
答案 0 :(得分:10)
要使有关未使用参数的编译器警告静音。
有可能但不便携。如果在给定平台上地址适合unsigned long
,那就没问题了。在可用的平台上使用uintptr_t
可以使此代码可移植。
答案 1 :(得分:2)
转换为void
主要用于使编译器对未使用的变量的警告静音,请参阅Suppress unused-parameter compiler warnings in C/C++:
如果可能,您应该使用uintptr_t
而不是 unsigned long ,即无符号整数类型,能够保存指针。我们可以从草案C99标准部分7.18.1.4
中看到能够保存对象指针的整数类型,其中包含:
以下类型指定带有的无符号整数类型 可以将任何有效指向void的指针转换为此类型的属性, 然后转换回指向void的指针,结果将进行比较 等于原始指针:
uintptr_t的
答案 2 :(得分:0)
(void)arg1
什么都不做,但让编译器使用变量。这是一种获取函数的方法,该函数接受未使用的参数但避免任何"参数未被使用"编译器警告。
将unsigned long传递给带void *
的函数时,会使用第二种方法。如果你还在处理C ++,那么拥有一个重载函数可能会更好。这也有一个缺点,就是要求指针至少与unsigned long
一样大,因此它可能无法在某些平台上运行。