我认为我很熟悉C语法,直到我尝试编译以下代码:
void f(int i; double x)
{
}
我期望编译器跳闸,但确实如此,但我没有收到错误消息:
test.c:1:14: error: parameter ‘i’ has just a forward declaration
然后我尝试了
void fun(int i; i)
{
}
以
失败test.c:1:17: error: expected declaration specifiers or ‘...’ before ‘i’
最后
void fun(int i; int i)
{
}
令我惊讶的是,成功了!
我从未在现实世界的C代码中看到过这种语法。有什么用?
答案 0 :(得分:29)
这种形式的功能定义:
void fun(int i; int i)
{
}
使用名为参数转发声明功能的GNU C扩展。
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
此功能允许您在实际参数列表之前具有参数转发声明。例如,这可以用于具有可变长度数组参数的函数,以在可变长度数组参数之后声明大小参数。
例如:
// valid, len parameter is used after its declaration
void foo(int len, char data[len][len]) {}
// not valid, len parameter is used before its declaration
void foo(char data[len][len], int len) {}
// valid in GNU C, there is a forward declaration of len parameter
// Note: foo is also function with two parameters
void foo(int len; char data[len][len], int len) {}
在OP示例中,
void fun(int i; int i) {}
forward参数声明不起任何作用,因为它没有在任何实际参数中使用,fun
函数定义实际上等同于:
void fun(int i) {}
请注意,这是一个GNU C扩展,它不是C.使用gcc
和-std=c99 -pedantic
进行编译会得到预期的诊断:
警告:ISO C禁止转发参数声明[-pedantic]
答案 1 :(得分:-2)
这取决于您使用的是哪个编译器。尝试不带“;”并使用“,”。