gpt4 book ai didi

c - 什么是参数前向声明?

转载 作者:太空狗 更新时间:2023-10-29 16:22:51 25 4
gpt4 key购买 nike

我以为我很了解 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 代码中见过这种语法。它的用途是什么?

最佳答案

这种形式的函数定义:

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) {}

前向参数声明没有任何作用,因为它没有用在任何实际参数中,fun 函数定义实际上等同于:

void fun(int i) {}

请注意,这是一个 GNU C 扩展,它不是 C。使用 gcc-std=c99 -pedantic 编译会给出预期的诊断:

warning: ISO C forbids forward parameter declarations [-pedantic]

关于c - 什么是参数前向声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17771484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com