具有函数签名,例如:
pub fn hash(input: &[u8]) -> [u8; 32]
Run Code Online (Sandbox Code Playgroud)
这 32 个字节如何传递给调用函数?(在优化之前,可能会将某些部分放入寄存器中。)
可能性包括:
free()插入到调用函数中。只是好奇,我不需要这些信息。答案可能因架构而异。
我有一个.lib静态库.我已在链接器设置"附加库目录"和"附加依赖项"下链接它,以及使用它pragma comment (lib, "mylib")..所有这些都很好.
我在问什么,我看起来似乎只能找到链接解决方案,是如何实际使用它中的功能.如果我的静态库中引用了一个函数'MyFunc',我该如何调用它?Visual Studio当前不识别库中定义的任何名称空间或函数.
谢谢!
这是一个简单的程序:
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架构).
谢谢
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,即使在函数调用之后?
是的,以前曾经多次询问过,但我想知道哪一个更合适?
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)
?
我试图证明一个简单的函数调用,如
window.alert();
Run Code Online (Sandbox Code Playgroud)
是有效的EcmaScript 2016(第7版)语法.落后的工作,并期望这是一个ExpressionStatement,我看到它适合的模式MemberExpression参数是一个CallExpression.并且,第12.3节将LeftHandSideExpression定义为可能是CallExpression.现在,我的问题是12.15 节AssignmentExpression似乎要求 LeftHandSideExpression后跟AssignmentExpression或AssignmentOperator,而AssignmentExpression不能;
我可能错过了一些简单的东西.方向将非常感谢.
所以假设我想调用一些函数。如果我用 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) 我正在尝试使用函数指针来调用另一个函数,但它给了我一个错误。我不明白这个错误。
这是我的代码:
#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)
我想我错误地使用了函数指针。有人可以解释如何以正确的方式实施这个程序吗?
我正在尝试创建一个函数指针数组,以便我可以使用指针打印函数的输出。(来自《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。
有谁知道这个问题的解决方案?谢谢你!
让我们考虑这两个函数:
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)
并避免变量声明?
function-call ×10
c ×5
arrays ×3
c++ ×2
.lib ×1
arguments ×1
bnf ×1
common-lisp ×1
compilation ×1
declaration ×1
ecmascript-7 ×1
javascript ×1
lambda ×1
parameters ×1
pointers ×1
python ×1
python-3.x ×1
rust ×1
using ×1