本地同义变量为非精确类型

时间:2011-06-07 20:15:01

标签: c function gcc constants typedef

我对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

感谢任何帮助。

3 个答案:

答案 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的值将修改为匹配(除非您添加代码以更新它) 。这很少是一个问题,但仍然需要注意的事情。