【问题标题】:typedef in C and function pointersC 中的 typedef 和函数指针
【发布时间】:2021-03-25 15:55:31
【问题描述】:

我在自己的头文件和c文件中编写了一些对它们进行操作的结构和相应的函数。

我想知道是否可以为代码创建一个新的头文件和 c 文件,以使用新的适当描述性声明“继承”那些特定类型和函数?是否可以以这种方式对函数和结构进行 typedef 以便重用代码?

我已经研究过函数指针,但我不确定这是否是实现我所追求的正确工具。我想另一种选择是重构代码,以便名称是通用的。

代码示例:

// function1.h

typedef struct src_data {
      ...
} src_data;

src_data* process_src_data(...) {
   ...
   return new_data;
}
// function2.h

#include "function1.h"
typedef src_data dest_data;

typedef dest_data* (*process_dest)(void);
process_dest process_dest_data = &process_src_data;

用法如下:

#include "function1.h"
#include "function2.h"

src_data *sourceData = process_src_data(...);

dest_data *destinationData = process_dest_data(...); 

【问题讨论】:

  • 是吗?为什么不呢?顺便说一句,你知道#include 是做什么的吗?
  • 请解释一下你认为我做错了什么......?
  • 所以基本上你想使用不同名称的函数?
  • 是的,没错

标签: c function-pointers typedef


【解决方案1】:

粗略而简单的解决方案:

// function2.h
#define process_dest_data process_src_data

一种更好的方法是使用static inline 函数作为包装器:

// function2.h
static inline dest_data* process_dest_data(void) {
    return process_src_data();
}

使用inline 将帮助您避免有关未使用函数的警告。

两者都可能导致相似的目标代码。

宏比包装器有一个微妙的优势。假设process_src_data 有外部链接。表达式&process_dest_data 可能在每个翻译单元中具有不同的值。如果使用宏,则值将相同,等于&process_src_data

【讨论】:

  • 很好,这是一个很好的技巧。谢谢。
【解决方案2】:

是否可以为代码创建一个新的头文件和 c 文件,以使用新的适当描述性声明“继承”那些特定类型和函数?

C 是一种非常(现在;)简单的语言,您必须自己编写很多东西。其他语言——尤其是面向对象的语言、C++、Java——有一个内置的“继承”特性,该语言本身允许将所有函数从一个地方“导入”到另一个地方。

C 没有此功能。在 C 中,您必须自己编写所有内容。

我不确定这是否正确

  1. 不要在头文件中定义函数。不要:

// function1.h
src_data* process_src_data(void) { /* NO */ }

而是将函数声明放在源文件的标题和定义中。

// function1.h
src_data* process_src_data(void); //ok
// function1.c
src_data* process_src_data(void) { ok(); }

否则它不是“正确的”,从某种意义上说,包含链接在一起的该标题的多个 .c 文件将导致“多个定义”问题。

  1. 与函数指针声明类似:

// function2.h
process_dest process_dest_data = &process_src_data;

要么将函数指针设为static,要么将其移动到单独的C 源文件并将extern 添加到标题中。另外,如果它打算保持不变,则将const 添加到其中,以便可以将其优化为只读部分而不使用 RAM。

// function2.h
extern const process_dest process_dest_data;
// function2.c 
const process_dest process_dest_data = &process_src_data;

实现我所追求的工具。

函数指针占用内存。调用函数指针需要取消引用它们。它们很难优化。

在 C 中编写简短的 static 包装函数是很典型的:

// function2.h
static process_dest process_dest_data(void) {
     return process_src_data();
}

如果函数很短,它将被编译器内联并从生成的可执行文件中删除。更长时间,只需编写一个调用底层实现的常规函数​​即可。

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2016-04-26
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多