函数原型是否在C中转换实际参数?

问题描述 投票:1回答:2

如果您阅读任何函数的linux手册页,并且原型使用staticrestrict这样的关键字作为任何形式参数,如果类型仍然匹配,C编译器会自动转换您的var吗?

例如:

功能原型:int function_name(int* restrict param1, static int param2);

程序:

int *my_var1;
int my_var2;

//initialization
(..)

function_name(my_var1, my_var2);

(..)

function_name()是否转换或处理我的变量,因为它们在每种情况下都用restrictstatic声明,因为类型仍然相同?

c linux parameters posix keyword
2个回答
4
投票

单个int论证不能是static,没有任何意义。请提供实际的实例,以确保我们谈论相同的事情。

当谈到restrict时,它用于表示由它限定的指针是指向该特定对象的唯一指针(或多或少,我正在简化)。因此,谈论将指针“转换”为restricted是没有意义的,限定符是否真正适用取决于指针的使用方式。

通常,在可能的情况下,将转换参数以匹配函数所期望的内容。


0
投票

首先,int function_name(int* restrict param1, static int param2);无效。在gcc 8.3下编译,您将收到以下错误:

<source>:1:52: error: storage class specified for parameter 'param2'
 int function_name(int* restrict param1, static int param2);

来自cpprefrence implicit conversions

转换就像分配一样

...

在函数调用表达式中,对于具有原型的函数,每个参数表达式的值都将转换为相应参数的非限定声明类型的类型

...

指向非限定类型的指针可以隐式转换为指向该类型的限定版本的指针(换句话说,可以添加const,volatile和restrict限定符。原始指针和结果比较相等。

你可以转换int*类型:

int *p;

进入volatile const int * restrict volatile const

volatile const int * restrict volatile const other_p = p;

没有任何错误。

function_name()是否转换或处理我的变量,因为它们在每种情况下都使用restrict和static声明,因为类型仍然相同?

是。变量被“隐式转换”为函数参数列表中的类型。它们将被视为在函数内声明。

© www.soinside.com 2019 - 2024. All rights reserved.