typedef 可见性

发布于 2024-11-01 09:14:01 字数 178 浏览 4 评论 0原文

我有几个“.c .h”文件。 在头文件(.h)中,我定义了2个typedef struct,我们称它们为TS1和TS2。

现在,TS1 的一个成员的类型是 TS2。 我希望只有 TS1 可见。 TS2 应该被隐藏。 TS2 应该仅对“.c”文件可见。

我怎样才能实现这个目标?

I have a ".c .h" couple of files.
In the header file (.h), I define 2 typedef struct, let's call them TS1 and TS2.

Now, the type of one member of TS1 is TS2.
I'd like that only TS1 is visible. TS2 should be hidden.
TS2 should be only visible to the ".c" file.

How can I achieve this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

风柔一江水 2024-11-08 09:14:01

我喜欢用“-internal”后缀命名私有头文件。对于你的例子,我有

foobar.c
    #include "foobar-internal.h"
    #include "foobar.h"
    /* functions using `struct TS1` and `struct TS2` */

.

foobar.h
    #ifndef H_FOOBAR_INCLUDED
    #define H_FOOBAR_INCLUDED
    struct TS1;
    #endif

foobar-internal.h
    #ifndef H_FOOBAR_INTERNAL_INCLUDED
    #define H_FOOBAR_INTERNAL_INCLUDED
    struct TS2 { int whatever; };
    struct TS1 { int whatever; struct TS2 internal; };
    #endif

使用您的函数的任何代码,包括更简单的“foobar.h”,并且可以使用指向struct TS1的指针。它不能直接使用 struct TS1 或 struct TS2 类型的对象。事实上,通过仅包含 "foobar.h",代码并不知道任何地方都存在 struct TS2 类型,并且可以根据自己的目的重新定义它。

usercode.c
    #include "foobar.h"
    struct TS1 *x;
    x = newTS1();
    work(x);
    destroyTS1(x);

I like to name private header files with the '-internal' suffix. For your example, I'd have

foobar.c
    #include "foobar-internal.h"
    #include "foobar.h"
    /* functions using `struct TS1` and `struct TS2` */

.

foobar.h
    #ifndef H_FOOBAR_INCLUDED
    #define H_FOOBAR_INCLUDED
    struct TS1;
    #endif

.

foobar-internal.h
    #ifndef H_FOOBAR_INTERNAL_INCLUDED
    #define H_FOOBAR_INTERNAL_INCLUDED
    struct TS2 { int whatever; };
    struct TS1 { int whatever; struct TS2 internal; };
    #endif

Any code using your functions, includes the simpler "foobar.h" and can use pointers to struct TS1. It cannot directly use objects of either struct TS1 or struct TS2 type. In fact, by including just "foobar.h", the code has no idea there exists a struct TS2 type anywhere and can redefine it to its own purposes.

usercode.c
    #include "foobar.h"
    struct TS1 *x;
    x = newTS1();
    work(x);
    destroyTS1(x);
地狱即天堂 2024-11-08 09:14:01

我同意鲁普的观点。

您可以做的是,例如 .h 中的 #define TS2 int 和 .c 文件顶部 #include 之后的 #undef TS2代码>.

尽管这不使用typedef。如果您想在多个 .c 文件中#include 它,您也可以在 .h 文件底部#undef 将其添加。

I agree with Rumple.

What you can do instead is e.g. #define TS2 int in the .h and #undef TS2 at the top of the .c file after the #include.

Though this doesn't use typedef. You can also #undef it in the bottom of the .h file if you want to #include it in multiple .c files.

流绪微梦 2024-11-08 09:14:01

AFAIK,这是不可能的。但是您可以为 TS1 和 TS2 有 2 个不同的 .h 文件。

AFAIK, this is not possible. But you can have 2 different .h files for TS1 and TS2.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文