有没有一种方法可以将局部结构传递给C(C11)中的函数



我有一个函数(attempt_volume_exchange_move(,在其中我定义了一个结构(status(。我想将status变量传递给我在attempt_volume_exchange_move(store_box_properties(中调用的函数。当尝试为store_box_properties编写代码时,我在CLion上收到以下警告消息:

"struct-status"的声明在此之外将不可见作用

说明我的问题的代码如下:

struct boxes {
// Member 1
// Member 2
// Member 3
// ...
// Member N
} box_dense, box_rare;
void attempt_volume_exchange_move(void) {
struct status {
struct boxes box_dense, box_rare;
} original, new;
store_box_properties(&original.box_dense);
store_box_properties(&original.box_rare);
}
void store_box_properties(struct status *status_pointer) { // Line where the warning message is given
// Code for store_box_properties
}

我该如何解决这个问题?我曾想过让status成为一个全局结构;然而这似乎是浪费的,因为CCD_ 8的定义仅在CCD_。我正试图用最"真诚"的方式来解决这个问题;正确的"/"适当的"/"优雅的";可能的方式。

事先感谢您的任何见解!

目前,有两个不同的结构声明具有相同的名称。第一个在函数attempt_volume_exchange_move

void attempt_volume_exchange_move(void) {
struct status {
struct boxes box_dense, box_rare;
} original, new;
//...

在功能块范围之外是不可见的。

函数store_box_properties参数列表中的第二个

void store_box_properties(struct status *status_pointer)

这在函数之外也是不可见的。

由于两个函数必须引用相同的结构,因此应在函数之外声明和定义该结构。

您可以通过在每个函数中定义兼容的局部结构,并通过指向void的指针将结构类型的对象从一个函数传递到另一个函数,来完成您想要做的事情。在第二个函数中,您可以将指针强制转换为此函数中声明的结构类型的指针。

但这使得代码变得不清晰,难以修改。

请注意,在您提供的代码中,这些调用中使用的参数表达式

store_box_properties(&original.box_dense);
store_box_properties(&original.box_rare);

不是CCD_ 12类型。它们属于struct boxes *型。

那么为什么不像一样声明函数store_box_properties

void store_box_properties(struct boxes *status_pointer)

您的struct status

void attempt_volume_exchange_move(void) {
struct status {
struct boxes box_dense, box_rare;
} ...

是函数本地的,如果将指向它的指针传递给另一个函数,则目标内容在该函数中不能被视为struct status

C不允许您从其他函数访问块本地定义。如果在转换单元的其他位置重新定义本地struct status,则新定义将与块本地定义不兼容。(尽管您可以利用http://port70.net/~nsz/c/c11/n1570.html#6.2.7漏洞,允许您在另一个翻译单元中访问它,如果您在那里提供了几乎相同的(相同的成员名称、类型、对齐和相同的标记(结构/联合定义,我不建议使用这种方法,因为它与任意可包含的头文件不兼容(。

如果您只是试图将指针传递给全局类型为struct boxesoriginal.box_denseoriginal.box_rare,那么您可以很容易地做到:

https://gcc.godbolt.org/z/fc33xo7bP

struct boxes {
// Member 1
// Member 2
// Member 3
// ...
// Member N
} box_dense, box_rare;
void store_box_properties(struct boxes *status_pointer);
void attempt_volume_exchange_move(void) {
struct status {
struct boxes box_dense, box_rare;
} original, new;
store_box_properties(&original.box_dense);
store_box_properties(&original.box_rare);
}
void store_box_properties(struct boxes *status_pointer) { // Line where the warning message is given
// Code for store_box_properties
}

也许您想将store_box_properties的参数键入为struct boxes *而不是struct status *

最新更新