Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何定义具有多个名称的函数_C_Gcc_Alias - Fatal编程技术网

C 如何定义具有多个名称的函数

C 如何定义具有多个名称的函数,c,gcc,alias,C,Gcc,Alias,我想用多个名称声明以下函数: static __inline__ int square(int i) { return i * i; } 它只需与GCC4.x一起使用(对于某些有用的x值) 我尝试过\uuuu asm\uuuu,但它只适用于非静态函数,因此这不起作用: static __inline__ int square2(int i) __asm__("square"); 我已经尝试了alias,但是它阻止了对square2的调用被内联,但是我希望对square和square2都进

我想用多个名称声明以下函数:

static __inline__ int square(int i) {
  return i * i;
}
它只需与GCC4.x一起使用(对于某些有用的x值)

我尝试过
\uuuu asm\uuuu
,但它只适用于非静态函数,因此这不起作用:

static __inline__ int square2(int i) __asm__("square");
我已经尝试了
alias
,但是它阻止了对
square2
的调用被内联,但是我希望对
square
square2
都进行内联

static __inline__ int square2(int i) __attribute__((alias("square2")));
我尝试过一个宏,但这阻止我在其他无关函数中使用名为
square
square2
的独立局部变量。所以我不能接受这个:

#define square2 square
我知道如何编写另一个调用,但我不喜欢它,因为它是优化器的又一个间接方法,在某些复杂情况下可能会阻止内联:

static __inline__ int square2(int i) { return square(i); }
还有其他解决方案吗?

我想您的“真实”代码的功能比单个语句更复杂?否则,显而易见的选择是使用第二个名称重复定义

当然,您可以将其设置为宏:

#define SQUARE_BODY(a) return (a) * (a);

static inline square(int x)
{
  SQUARE_BODY(x);
}

static inline square2(int x)
{
  SQUARE_BODY(x);
}

当然,您可以将更多的函数定义折叠到宏中,但我认为,仅将其作为主体部分会使代码的其余部分更清晰。

内联函数已内联到其调用站点中。因此它们没有名称(除非您强制编译器不内联它们,例如通过获取它们的地址)。为什么不在仅从多个命名函数(square,square2)调用的静态实现函数上使用“始终内联”属性?在这种情况下,不应该有额外的间接层。我很好奇最后一种选择(简单地包装第一个调用)。它实际上是内联的吗?好奇的是,为什么你想要多个名字?