【问题标题】:Does a function prototype convert your actual parameters in C?函数原型是否会转换 C 中的实际参数?
【发布时间】:2019-04-09 09:43:07
【问题描述】:

如果您阅读了任何函数的 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 声明的那样转换或处理我的变量?

【问题讨论】:

  • , static int param2); 无效。你可以, int param2[static]); 但这并不意味着什么。

标签: c linux parameters posix keyword


【解决方案1】:

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

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

一般情况下,参数将被转换为与函数所期望的匹配,如果可能的话。

【讨论】:

  • @KamilCuk 哎呀,对不起,你当然是对的。我需要更多地使用它。 :) 谢谢。
【解决方案2】:

首先,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() 是否会转换或处理我的变量,就像它们在每种情况下都使用限制和静态声明一样?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2016-05-16
    • 2015-09-06
    • 2013-04-23
    • 2016-06-08
    相关资源
    最近更新 更多