相关疑难解决方法(0)

C不是那么难:void(*(*f [])())()

我今天刚看了一张照片,觉得我很感激解释.所以这是图片:

一些c代码

我发现这令人困惑,并想知道这些代码是否实用.我用Google搜索了这张照片,并在 reddit条目中找到了另一张照片,是照片:

一些有趣的解释

那么"螺旋式阅读"是有效的吗?这是C编译器解析的方式吗?
如果对这个奇怪的代码有更简单的解释,那就太好了.
除此之外,这些代码是否有用?如果是这样,何时何地?

一个关于"螺旋规则"的问题,但我不只是询问它是如何应用的,或者是如何用该规则读取表达式的.我也质疑这种表达方式的使用和螺旋规则的有效性.关于这些,已经发布了一些很好的答案.

c parsing pointers function-pointers void-pointers

184
推荐指数
10
解决办法
1万
查看次数

在C中使用dlopen时,有没有一种优雅的方法来避免dlsym?

lib.so如果在运行时满足特定条件,则需要动态打开共享库。该库包含约700个函数,我需要加载所有符号。

一个简单的解决方案是定义指向其中包含的所有符号的函数指针lib.so,使用加载库dlopen,最后使用来获取所有符号的地址dlsym。但是,鉴于功能的数量,实现此解决方案的代码非常繁琐。

我想知道是否存在一个更优雅,更简洁的解决方案,也许是通过适当地使用宏来定义函数指针。谢谢!

c function-pointers shared-libraries dlopen

7
推荐指数
2
解决办法
3627
查看次数

使用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()不接受值并返回指向函数的指针,该函数将两个doubles作为输入并返回一个double.然后我设置了一个编译共享对象的系统调用foo.so …

c dlopen dlsym

6
推荐指数
2
解决办法
4511
查看次数

是否可以"typedef"(各种)一个函数原型?

我有多个彼此相似的函数 - 它们接受相同的参数,并返回相同的类型:

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)

c typedef function-prototypes

6
推荐指数
2
解决办法
323
查看次数

嵌入式C - 函数的参数太多(指针)

我试图在我的.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.

c embedded gcc

5
推荐指数
2
解决办法
1514
查看次数

难以理解c ++中的函数指针

我正在阅读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)

而不是它实际上是什么?

c++ function-pointers

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

如何在c中将void函数(void)作为参数传递给另一个函数

[在此处输入图像描述][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)

c parameters function-call function-declaration

-5
推荐指数
1
解决办法
2473
查看次数