请考虑以下代码:
#include <stdio.h>
typedef int (*addif_fn_t) (int, int, int);
int add (int a, int b) {
return a + b;
}
int addif (int a, int b, int cond) {
return cond ? (a + b) : 0;
}
int main() {
addif_fn_t fn;
fn = addif;
printf("addif:\t%d %d\n", fn(1, 2, 1), fn(1, 2, 0));
fn = (addif_fn_t)add;
printf("add:\t%d %d\n", fn(1, 2, 1), fn(1, 2, 0));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在使用标准C调用约定的任何Intel计算机上,这会导致:
addif: 3 0
add: 3 3
Run Code Online (Sandbox Code Playgroud)
问题是:这个成语有多便携?C允许调用一个参数多于它接受的函数吗?
我的猜测是它完全取决于ABI以及它如何确定函数参数和局部变量的存储位置.更重要的是,这可能不是可移植代码.但我已经看到这个习惯用法在实际代码库中多次使用.
c ×1