相关疑难解决方法(0)

为什么这在C中合法?

我正在为我的大学编写一个编译器/语言课程的玩具C编译器.

我试图在C中充实符号解析的语义,并提出了我尝试对常规编译器clang&gcc的测试用例.

void foo() { }
int main() { foo(5); } // foo has extraneous arguments
Run Code Online (Sandbox Code Playgroud)

大多数编译器似乎只是警告无关的论点.

问题:这背后的根本原因是什么?

对于我的符号表生成/解析阶段,我正在考虑一个函数是一个带有返回类型的符号,以及几个参数化的参数(基于语法),每个参数都有一个相应的类型.

谢谢.

c language-design

16
推荐指数
3
解决办法
830
查看次数

调用带有额外参数的C函数是否可移植?

请考虑以下代码:

#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

2
推荐指数
1
解决办法
237
查看次数

标签 统计

c ×2

language-design ×1