gpt4 book ai didi

c - 在 C 函数原型(prototype)中添加结构名称,返回数据类型之前

转载 作者:行者123 更新时间:2023-11-30 15:07:52 25 4
gpt4 key购买 nike

在查看开源 C 代码时,我发现了一个头文件,其中包含如下代码:

typedef struct MY_STRUCT {
//structure members
//...
} my_struct_t;

MY_STRUCT int funcA();
MY_STRUCT int funcB();

我的问题是:添加MY_STRUCT的目的是什么?在函数原型(prototype)前面?

感谢您的帮助。

编辑:原来是MY_STRUCT函数原型(prototype)中涉及编译器相关扩展的宏。我找到了以下宏。

#define DUMMY __attribute__ ((visibility ("default"))) 
#define MY_STRUCT DUMMY

但是,我现在可以认为使用 MY_STRUCT 是不好的编码吗?作为结构的名称?或者这看起来是故意的吗?

最佳答案

此代码使用编译器特定的扩展,可能是 GCC。其目的是设置 my_struct_tFuncAFuncB 的可见性。根据 GCC 关于可见性的文档:

Default visibility is the normal case for the object file format. This value is available for the visibility attribute to override other options that may change the assumed visibility of entities.

On ELF, default visibility means that the declaration is visible to other modules and, in shared libraries, means that the declared entity may be overridden.

On Darwin, default visibility means that the declaration is visible to other modules.

Default visibility corresponds to "external linkage" in the language.

这当然表明代码是使用标志(例如 -fvisibility=hidden)编译的,默认情况下不会将符号置于 default 可见性中,这是正常的例如编译动态库时。基本上默认可见性意味着符号应该在动态库中外部可见。

另请注意,通过设置类型的可见性,他们使用仅在 C++ 模式下允许/有意义的构造。

关于这是不好还是好的做法的问题是见仁见智的。人们普遍认为,只对属于动态库 API 一部分的函数启用外部可见性,并且出于各种原因,通常使用宏来实现这一点(部分是因为不同的编译器不同,但也因为您想要以不同的方式声明它们)然后使用该库时)。

但是,使用宏名称 MY_STRUCT 恕我直言,它会令人困惑,显然它也会让您和其他人感到困惑。人们不会期望 MY_STRUCT 成为使符号在外部可见的“神奇符号”。我建议将其命名为 MYLIB_API 或类似名称。

关于c - 在 C 函数原型(prototype)中添加结构名称,返回数据类型之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37874723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com