我对C有点新意,所以我不熟悉如何解决这个问题。在您阅读时,您会注意到我找到一个解决方案并不重要,但对于此应用程序和将来的参考肯定会很好。 :)
我有一个参数int hello,我不想制作一个不是它的同义副本。
f(int hello, structType* otherParam){
// I would like to have a synonom for (!hello)
}
我的第一个想法是制作一个局部常量,但我不确定是否会有额外的内存消耗。我正在使用GCC构建,我真的不知道它是否会识别参数的常量(在任何修改之前),因为它只是一个同义变量。我不这么认为,因为参数可能(即使它不会)稍后在该函数中改变,这不会影响常量。
然后我考虑制作一个本地typedef,但我不确定这样做的语法。我尝试了以下方法:
typedef (!hello) hi;
但是我收到以下错误。
D:/src-dir/file.c: In function 'f':
D:/src-dir/file.c: 00: error: expected identifier or '(' before '!' token
感谢任何帮助。
答案 0 :(得分:1)
Typedef定义了一个类型的别名,它不是你想要的。所以..
!hello
为什么需要!hello
的“同义词”?任何程序员都会立即识别!hello
,而不是寻找定义“同义词”的聪明技巧。
答案 1 :(得分:1)
通常,在C中,您希望编写最清楚地表达您的意图的代码,并允许优化器找出最有效的方法来实现它。
在经常重复使用的计算示例中,将结果存储在const
- 限定变量中是最合适的方法 - 如下所示:
void f(int hello)
{
const int non_hello = !hello;
/* code that uses non_hello frequently */
}
或更有可能:
void x(structType *otherParam)
{
char * const d_name = otherParam->b->c->d->name;
/* code that uses d_name frequently */}
}
请注意,这样的const
变量不必须分配任何内存(除非你在某处使用&
的地址) - 优化者可能只是放置它在寄存器中(并记住,即使它 获得分配的内存,它也可能是堆栈内存)。
答案 2 :(得分:0)
鉴于:
f(int hello, structType* otherParam){
// I would like to have a synonom for (!hello)
}
对你所拥有的内容的明显直接回答是:
f(int hello, structType *otherParam) {
int hi = !hello;
// ...
}
我 期望从中看到对执行速度的任何重大(或可能甚至是次要的)影响。实际上,执行速度可能没有太大的提升空间。
有时候这样的事情可以使代码更具可读性。另请注意,当/如果您修改hello
的值时,hi
的值将不修改为匹配(除非您添加代码以更新它) 。这很少是一个问题,但仍然需要注意的事情。