我有一个函数(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 boxes
的original.box_dense
、original.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 *
?