标签: function-call

Rust 如何返回大类型(优化前)?

具有函数签名,例如:

pub fn hash(input: &[u8]) -> [u8; 32]
Run Code Online (Sandbox Code Playgroud)

这 32 个字节如何传递给调用函数?(在优化之前,可能会将某些部分放入寄存器中。)

可能性包括:

  • 在堆栈上,调用函数必须将它们复制到其自己的堆栈帧中预先分配的空间中。
  • 在堆上,将生成的free()插入到调用函数中。
  • 有些是按线程静态分配的缓冲区。

只是好奇,我不需要这些信息。答案可能因架构而异。

function-call rust

3
推荐指数
1
解决办法
72
查看次数

在visual studio 2012中使用.lib(C++)

我有一个.lib静态库.我已在链接器设置"附加库目录"和"附加依赖项"下链接它,以及使用它pragma comment (lib, "mylib")..所有这些都很好.

我在问什么,我看起来似乎只能找到链接解决方案,是如何实际使用它中的功能.如果我的静态库中引用了一个函数'MyFunc',我该如何调用它?Visual Studio当前不识别库中定义的任何名称空间或函数.

谢谢!

c++ using static-libraries function-call .lib

2
推荐指数
1
解决办法
9831
查看次数

为什么VS2013将函数调用编译成两个指令而不是一个?

这是一个简单的程序:

void func()
{
    printf("hello");
}

int main()
{
    printf("%p",func);
    func();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

踩到线printf("%p",func),我00F811AE打印在控制台上.

拆卸线func(),给我call _func (0F811AEh)- 到目前为止一切顺利.

但是拆解内容func,第一条指令出现在地址上00F813C0.

所以我"去看看"地址是什么00F811AE,我找到了jmp func (0F813C0h).

总结一下,似乎函数调用被编译为两个指令:

call _func (0F811AEh)
jmp   func (0F813C0h)
Run Code Online (Sandbox Code Playgroud)

为什么VS2013编译器使用两条指令而不只是一条?

似乎一个人jmp会完成这项工作.我甚至要问这个因为我有一种感觉,其他编译器也以类似的方式进行(当然,取决于底层的HW架构).

谢谢

c c++ compiler-construction compilation function-call

2
推荐指数
1
解决办法
132
查看次数

函数调用作为参数在python 3.x中打印

a = 0
def f():
    global a
    a = 1
    print(a)
print(a, f(), a)
Run Code Online (Sandbox Code Playgroud)

上述代码的输出结果如下:

1
0 None 1
Run Code Online (Sandbox Code Playgroud)

为什么f在打印第一个参数之前调用函数a?为什么是第一个参数的值0,即使在函数调用之后?

python function-call python-3.x

2
推荐指数
1
解决办法
55
查看次数

"array"和"&array [0]"完全可以互换吗?

是的,以前曾经多次询问过,但我想知道哪一个更合适?

typedef struct {
    int a;
    int addr[8];
} usr_command;

usr_command* p_usr_command;

int foo(int* parameter)
{}
Run Code Online (Sandbox Code Playgroud)

那么哪一个不太容易出问题?

foo(p_usr_command->addr);
Run Code Online (Sandbox Code Playgroud)

要么

foo(&p_usr_command->addr[0]);
Run Code Online (Sandbox Code Playgroud)

c arrays pointers parameter-passing function-call

2
推荐指数
1
解决办法
186
查看次数

JavaScript函数是否调用LeftHandSideExpression,因此是一个ExpressionStatement?

我试图证明一个简单的函数调用,如

window.alert();
Run Code Online (Sandbox Code Playgroud)

是有效的EcmaScript 2016(第7版)语法.落后的工作,并期望这是一个ExpressionStatement,我看到它适合的模式MemberExpression参数是一个CallExpression.并且,第12.3节将LeftHandSideExpression定义为可能是CallExpression.现在,我的问题是12.15AssignmentExpression似乎要求 LeftHandSideExpression后跟AssignmentExpressionAssignmentOperator,AssignmentExpression不能;

我可能错过了一些简单的东西.方向将非常感谢.

javascript bnf function-call ecmascript-7

2
推荐指数
1
解决办法
87
查看次数

为什么 Common-Lisp Lambda 表达式是有效的函数名?

所以假设我想调用一些函数。如果我用 defun 定义了函数,我只需在列表的开头使用函数的名称,然后使用它的参数,就像这样(我将在示例中使用“=>”来显示输入代码的输出进入 CLisp REPL):

(defun f (a) (lambda (b) (+ a b))) => F
(f 12) => #<FUNCTION :LAMBDA (B) (+ A B)>
Run Code Online (Sandbox Code Playgroud)

足够简单。列表的第一个元素必须是函数、特殊运算符或宏的名称。除此之外,以下内容也有效:

((lambda (a) (+ a 12)) 1) => 13
Run Code Online (Sandbox Code Playgroud)

快速谷歌搜索显示 LAMBDA 既是一个符号又是一个宏。试图扩大宏产量:

(macroexpand '(lambda (a) (+ a 12))) => #'(LAMBDA (A) (+ A 12))
Run Code Online (Sandbox Code Playgroud)

这没有帮助。我无法区分宏 LAMBDA 和符号 LAMBDA,而且我完全不清楚为什么我可以使用 lambda 表达式作为函数名而不是 #'f,据我所知,应该以与 #'(LAMBDA (A) (+ A 12)) 相同的方式计算函数 F 的有效函数指示符,但是:

(#'f 12) => *** - EVAL: #'F is not a function name; try using a symbol instead …
Run Code Online (Sandbox Code Playgroud)

lambda common-lisp function-call

2
推荐指数
1
解决办法
629
查看次数

这个错误是什么意思?“void”类型的参数与“void (*)(int a)”类型的参数不兼容

我正在尝试使用函数指针来调用另一个函数,但它给了我一个错误。我不明白这个错误。

这是我的代码:

#include<stdio.h>
#include<stdlib.h>

void print(void (*ptr)(int));
void printint(int);

int main()
{
    char a;
    int b;
    scanf("%c %d",&a,&b);
    print(printint(b));
    return 0;
} 

void print(void (*ptr)(int a))
{
    ptr(a);
}

void printint(int a)
{
    // printf("executed");
    printf("%d",a);
}
Run Code Online (Sandbox Code Playgroud)

我想我错误地使用了函数指针。有人可以解释如何以正确的方式实施这个程序吗?

c function-pointers function-call function-parameter

2
推荐指数
1
解决办法
96
查看次数

打印函数指针时出现不兼容的指针类型警告

我正在尝试创建一个函数指针数组,以便我可以使用指针打印函数的输出。(来自《Effective C》一书的练习。)

#include <stdio.h>
#include <stdlib.h>

int a(void) { return 1; }
int b(void) { return 2; }
int c(void) { return 3; }

int main(void)
{

    int(*func_arr)[3] = {&a, &b, &c};
    printf("%d\n", (*func_arr)[0]);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我编译它时,我收到警告

starting.c:10:26: warning: incompatible pointer types initializing 'int (*)[3]' with an expression of type
      'int (*)(void)' [-Wincompatible-pointer-types]
    int(*func_arr)[3] = {&a, &b, &c};
                         ^~
starting.c:10:30: warning: excess elements in scalar initializer
    int(*func_arr)[3] = {&a, &b, &c};
                             ^~
Run Code Online (Sandbox Code Playgroud)

而且,当我运行该程序时,我得到的输出为 -443987883,而它应该只是 1。

有谁知道这个问题的解决方案?谢谢你!

c arrays function-pointers declaration function-call

2
推荐指数
1
解决办法
294
查看次数

在 C 语言中,是否可以在一行中编写对具有字符串数组(即 ptr)或 int 或 ... 作为参数的函数的调用?

让我们考虑这两个函数:

void my_foo1(char ** my_par, int size) {
    for (int i=0; i<size; i++) printf("%s \n",my_par[i]);
}

void my_foo2(int * my_par, int size) {
    for (int i=0; i<size; i++) printf("%d \n",my_par[i]);
}
Run Code Online (Sandbox Code Playgroud)

为了调用它们,需要声明并初始化变量。之后,使用这些变量在第二行调用函数。

char * (my_strs[3])={"hello","world","!!!!"};
my_foo1(my_strs,3);

int my_ints[3]={1,2,3};
my_foo2(my_ints,3);
Run Code Online (Sandbox Code Playgroud)

是否可以写这样的东西:

my_foox(????,3)
Run Code Online (Sandbox Code Playgroud)

并避免变量声明?

c arrays parameters arguments function-call

2
推荐指数
1
解决办法
135
查看次数