lib.so
如果在运行时满足特定条件,则需要动态打开共享库。该库包含约700个函数,我需要加载所有符号。
一个简单的解决方案是定义指向其中包含的所有符号的函数指针lib.so
,使用加载库dlopen
,最后使用来获取所有符号的地址dlsym
。但是,鉴于功能的数量,实现此解决方案的代码非常繁琐。
我想知道是否存在一个更优雅,更简洁的解决方案,也许是通过适当地使用宏来定义函数指针。谢谢!
我正在使用dlsym()
,C
我有一个问题是dlsym()
应该显式转换返回值还是隐式正确转换.这是功能:
double (*(compile)(void))(double x, double y)
{
if (system("scan-build clang -fPIC -shared -g -Wall -Werror -pedantic "
"-std=c11 -O0 -lm foo.c -o foo.so") != 0) {
exit(EXIT_FAILURE);
}
void *handle;
handle = dlopen("./foo.so", RTLD_LAZY);
if (!handle) {
printf("Failed to load foo.so: %s\n", dlerror());
exit(EXIT_FAILURE);
}
foo f;
f = (foo)dlsym(handle, "foo");
if (!f) {
printf("Failed to find symbol foo in foo.so: %s\n", dlerror());
exit(EXIT_FAILURE);
}
return f;
}
Run Code Online (Sandbox Code Playgroud)
该函数compile()
不接受值并返回指向函数的指针,该函数将两个double
s作为输入并返回一个double.然后我设置了一个编译共享对象的系统调用foo.so …
我有多个彼此相似的函数 - 它们接受相同的参数,并返回相同的类型:
double mathFunction_1(const double *values, const size_t array_length);
Run Code Online (Sandbox Code Playgroud)
我已经使用了typedef'd指向那些函数的指针,因为我将它们存储为一个数组,以便在相同的数据上轻松使用它们,映射它们等:
typedef double (* MathFunction_ptr )(const double *, const size_t);
double proxy(MathFunction_ptr mathfun_ptr, const double *values, const size_t array_length);
Run Code Online (Sandbox Code Playgroud)
我想要实现的是与声明和定义函数类似的易用性,就像我已经使用指针一样.
因此,我正在考虑使用类似的typedef来让我更容易编写实际的函数.我尝试这样做:
// declaration
typedef double MathFunction (const double *values, const size_t array_length);
MathFunction mathFunction_2;
Run Code Online (Sandbox Code Playgroud)
以下方法部分起作用.它允许我在声明中"保存一些键击",但是必须完全输入定义.
double mathFunction_2(const double *values, const size_t array_length)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
我通过搜索更多这个问题找到的是:函数原型typedef可以用在函数定义中吗?
然而,它没有提供很多替代方案,只是重申我根据标准禁止在我的其他实验中尝试做的事情.它提供的唯一选择是使用
#define FUNCTION(name) double name(const double* values, size_t array_length)
Run Code Online (Sandbox Code Playgroud)
这听起来很笨(因为我对使用预处理器持谨慎态度和怀疑态度).
我正在尝试做什么的替代方案是什么?
我试过的另外两种方法不起作用(而且,正如我刚才所读,根据C标准6.9.1禁止和绝对错误):
1.这种方法不起作用,因为这意味着我告诉它定义一个变量mathFunction_2(我相信变量被视为一个指针,虽然我还不太了解它),就像一个函数:
MathFunction mathFunction_2
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
2.这种方法不起作用,因为它意味着我告诉它创建一个返回函数的函数(在C语言中不可接受):
MathFunction mathFunction_2() …
Run Code Online (Sandbox Code Playgroud) 我试图在我的.cpp文件中调用以下宏:
#define IAP_ROM_LOCATION 0x1FFF1FF1UL
#define IAP_EXECUTE_CMD(a, b) ((void (*)())(IAP_ROM_LOCATION))(a, b)
Run Code Online (Sandbox Code Playgroud)
但是,当我像这样调用所述函数时:
IAP_EXECUTE_CMD(0, 0);
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,说明有太多的参数?这怎么样?我会很感激任何指针.
开发环境是Cortex-M3的GCC.
我正在阅读Bjarne Stroustrup撰写的C++编程语言.它在某处使用using关键字来生成函数指针数据类型P1和P2,如下所示:
using P1 = int(?)(int?);
using P2 = void(?)(void);
Run Code Online (Sandbox Code Playgroud)
但是它使用using关键字来创建另一个函数指针数据类型:
using CFT = int(const void?, const void?); -(1)
Run Code Online (Sandbox Code Playgroud)
然后它使用CFT声明一个函数指针并在一些ssort函数中传递它:
void ssort(void? base, siz e_t n, size_t sz, CFT cmp);
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果使用"using"创建函数指针数据类型,则不应该行 - (1)为:
using CFT=int(*)(const void*, const void*);
Run Code Online (Sandbox Code Playgroud)
而不是它实际上是什么?
[在此处输入图像描述][1]我有一个void readline()
输出字符串的函数,我想将其作为参数传递给另一个函数,我该怎么做,
谢谢你的帮助。
int scorecount(argc1, argv1, void readline());
void readline();
int main(int argc, char *argv[]){
scorecount(argc,argv);
}
int scorecount(argc1, argv1, void readline()){
output a int
and I want to use the string from readline function somewhere in
scorecount
}
void readline(){
output a string
}
Run Code Online (Sandbox Code Playgroud)