以下是根据ISO/IEC 9899:2017(c17)的标准C函数声明吗?

int foo(int (bar), int (baz));

如果是这样,请给我指出标准中定义这一点的章节.

在N2310附录短语 struct 语法,A.2.2声明,第6.7.6节中,我看到以下内容:

parameter-list:
    parameter-declaration
    parameter-list , parameter-declaration

我不熟悉这种语法表达,所以我不知道如何解释它.

下面的程序编译时不会出现gcc --std=c17 -Wallclang --std=c17 -Wall错误

static int foo(int (bar), int (baz));
static int foo(int bar, int baz)
{
        return bar + baz;
}
int main() {
        return foo(1, 2);
}

然而,如果我在这个程序上运行cppcheck(一个静态分析工具),它似乎解析不正确.

我最感兴趣的是这个语法是标准的C,还是编译器特定的行为,这样我就可以try 修复解析器或提交错误报告,如果我做不到的话.

推荐答案

该声明是标准允许的.

C标准的6.7.6p1节给出了声明的完整语法,包括你引用的部分. 有关部分如下:

parameter-declaration的定义是:

参数声明:

  • 声明说明符声明符
  • 声明说明符抽象声明符 Select

A declarator定义为:

声明人:

  • 指针 Select 直接说明符

direct-declarator的定义(部分)为:

direct-声明人:

  • (声明符)

因此,我们可以从上面看到,参数名可以用括号括起来.

C++相关问答推荐

当包含头文件时,gcc会发出隐式函数声明警告

常数函数指针优化

ATmega328P USART发送字符重复打印

什么C代码将确定打开的套接字正在使用的网络适配器?

如何解决C中的严格别名?

__VA_OPT__(,)是否可以检测后面没有任何内容的尾随逗号?

ZED for SDL上的C语言服务器

Ruby C Api处理异常

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

向上强制转换C中的数值类型总是可逆的吗?

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

如何编写一个for循环来计算C中各项的总和?

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

-Wnonnull-Compare警告不是具有误导性吗?

在吉陀罗中,_2_1_和CONCAT11是什么意思?

无算术运算符和循环的二进制乘法

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

execve 不给出which命令的输出

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

文件指针引起的C程序分段错误