当您将函数作为函数调用的参数调用时,实际发生的是该函数被调用并将return value
放在堆栈上以传递给您正在调用的函数。
strthings(getStr1(), strlen(getStr1()), getStr2(), strlen(getStr2()));
转换为(顺序可能因编译器/cpu 而异)
auto t1 = getStr2(); // probably not exact order
auto t2 = strlen(t1);
auto t3 = getStr1();
auto t4 = strlen(t3);
strthings(t3, t4, t1, t2);
所以 - 你的一段代码:
*res = pthread_create (&a_thread , NULL , thread_fn( (void*)n) )
将转化为
// run the thread function and get the return value.
auto t1 = thread_fn((void*n));
*res = pthread_create(&a_thread, NULL, t1);
我们将在我们的线程上下文中运行 thread_fn,然后传递它的返回值。听起来您希望将函数作为参数传递给被调用函数并内联解释?
为什么传递函数和参数有效?
--- 编辑:解释为什么分别传递函数和参数有效。
在 C 中,函数名实际上是指针变量。指针的类型取决于函数的“指纹”。
int strncmp(const char* left, const char* right, int maxlen);
实际上是
int (*strncmp)(const char*, const char*, int);
也就是说,strncmp 是一个指向函数的指针,该函数返回一个 void 并采用指定类型的三个参数。
这形成了一个合同,所以当你写
int n = strncmp(a, b, 3);
它知道在 [presudo] 程序集中做一些事情,例如:
push a
push b
push 3
call 0x783af83 // strncmp
mov return -> n
pop 12
所以 - 现在您知道函数实际上是指针(指向代码),您可以了解如何传递它们,以便您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int func1() { return 1; }
int func2() { return 22; }
int flip(int useFirst, int (*first)(), int (*second)()) {
return (useFirst) ? first() : second();
}
int main() {
srand(time(NULL));
int useFirst = rand() % 2;
int result = flip(useFirst, func1, func2);
printf("use first is %u. return value was %u.\n", useFirst, result);
}