qt 下extern 引用出错 错误:storage class specified for 'childlist'

本文讨论了在Qt项目中如何正确地在不同类间使用全局变量,并提供了正确的实现方式,避免了常见的错误提示。
我在“mainwindow.h”中定义了
public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();
  void broadcastDatagram();
  void netTest();

  QStringList childlist;
  QStringList childstatelist;
  QStringList childnotelist;

然后在“showlist.h”中
public:
  explicit ShowList(QWidget *parent = 0);
  ~ShowList();
  extern QStringList childlist;
  extern QStringList childstatelist;
  extern QStringList childnotelist;
并且在“showlist.cpp"中引用,结果就出现了
错误:storage class specified for 'childlist'
/home/qust/qt/Server-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK____/../Server/showlist.h:18: 错误:storage class specified for 'childstatelist'

/home/qust/qt/Server-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK____/../Server/showlist.h:19: 错误:storage class specified for 'childnotelist'

其实这是个不能原谅的错误,extern只能找全局变量,我把变量声明在类里面,然后在类里面用extern当然是错的,

应该是这样的:


mainwindow.h也就是在MainWindow类外

extern QStringList childlist;
extern QStringList childstatelist;
extern QStringList childnotelist;
然后在mainwindow.cpp开头或结尾等处:
QStringList childlist;
QStringList childstatelist;
QStringList childnotelist;
如果其他类想使用这3个变量的话,就得:
extern QStringList childlist;
extern QStringList childstatelist;
extern QStringList childnotelist;

感谢:feilinhe等高人指点。。


<think>我们正在处理一个C语言编译错误:error: storage class specified for parameter ‘queue_node_t’。这个错误通常发生在函数声明或定义中,当参数前面使用了存储类说明符(如`extern`, `static`, `register`, `auto`等)时。在C语言中,函数的参数不能有存储类说明符(除了`register`在C99之前可以使用,但C11中已弃用,且现在一般也不推荐使用)。 让我们分析错误原因及解决方法: 1. **错误原因**: 在函数参数列表中,如果为参数指定了存储类,则会导致此错误。例如: ```c void func(static int a); // 错误:参数使用了存储类说明符static ``` 2. **常见情况**: - 可能是无意中在参数类型前添加了存储类关键字。 - 也可能是由于类型定义或宏展开导致。 3. **解决方法**: 检查函数声明或定义中参数列表,确保没有使用存储类说明符(如`static`、`extern`等)。如果使用了,将其删除。 4. **示例**: 错误代码: ```c void enqueue(static queue_node_t *node); // 错误:参数使用了static ``` 修正后: ```c void enqueue(queue_node_t *node); // 正确:去掉了static ``` 5. **注意**: 如果错误信息中提到的参数类型是`queue_node_t`,那么还需要确保`queue_node_t`类型已经被正确定义(通常是通过typedef定义的结构体或基本类型)。如果类型未定义,也会导致错误,但那是另一个错误。 6. **其他可能**: 有时,这个错误可能是由于在函数指针参数中错误地使用了存储类说明符。例如: ```c void func(void (*f)(static int))); // 错误:函数指针参数中的参数使用了static ``` 同样,需要去掉`static`。 7. **检查类型定义**: 确保`queue_node_t`是一个有效的类型。如果它是一个结构体,应该有这样的定义: ```c typedef struct queue_node { // 成员 } queue_node_t; ``` 8. **代码检查**: 请检查出现错误的函数声明或定义,找到参数`queue_node_t`所在的位置,查看其前面是否有存储类说明符,如果有,删除即可。 9. **扩展**: 在C语言中,函数参数允许的唯一存储类说明符是`register`(在C11中已弃用,但一些编译器仍然支持),但现代编译器通常忽略`register`,因为优化器可以自动决定将变量放入寄存器。因此,即使使用`register`,也建议去掉,因为可移植性更好。 10. **实际代码示例**: 假设你有一个函数声明如下: ```c void process(register queue_node_t *node); // 在C11中可能产生警告或错误 ``` 修正:去掉`register` ```c void process(queue_node_t *node); ``` 总结:该错误的原因是函数参数前有不允许的存储类说明符(如`static`、`extern`等),解决方法是删除这些说明符。 如果问题仍然存在,请提供出现错误的代码片段,以便更准确地分析。 §§相关问题§§ 1. C语言中函数的参数可以使用哪些存储类说明符? 2. 为什么C语言不允许在函数参数中使用`static`存储类? 3. 如何正确定义和使用`queue_node_t`这样的自定义类型? 4. C11标准中关于函数参数存储类的规定是什么? 5. 除了存储类说明符错误,还有哪些常见原因会导致C语言编译错误?</think>### C语言编译错误:参数使用了存储类说明符 **错误含义**: 这个错误表示在函数声明或定义中,某个参数(此处是 `queue_node_t`)前面使用了**存储类说明符**(如 `static`, `extern`, `register`, `auto` 等)。在C语言中,**函数参数不允许指定存储类**(除了已弃用的 `register`),因为参数的存储方式由编译器自动管理[^1]。 --- ### 常见原因及解决方法 #### 1. **错误地在参数前添加存储类说明符** ```c // 错误示例:参数前使用了 static void enqueue(static queue_node_t *node); ``` **修正**:删除参数前的存储类说明符 ```c // 正确 void enqueue(queue_node_t *node); ``` #### 2. **误将存储类用于类型定义** 如果 `queue_node_t` 是自定义类型(如结构体),需确保类型定义中未错误添加存储类: ```c // 错误示例 static typedef struct { ... } queue_node_t; // static 不能用于 typedef ``` **修正**: ```c // 正确 typedef struct { int data; struct queue_node *next; } queue_node_t; ``` #### 3. **函数指针参数声明错误** 若参数是函数指针,存储类可能被误加在回调函数参数上: ```c // 错误示例 void traverse( void (*callback)(static queue_node_t*) ); ``` **修正**: ```c // 正确 void traverse( void (*callback)(queue_node_t*) ); ``` --- ### 验证步骤 1. **检查函数声明/定义**: 定位报错位置(如 `void enqueue(static queue_node_t *node);`),删除参数前的 `static`/`extern` 等关键字。 2. **确认类型定义**: 确保 `queue_node_t` 正确定义(通常通过 `typedef`),且未混用存储类。 3. **编译测试**: 重新编译,常见编译器输出示例: ```bash # 修正前 error: storage class specified for parameter ‘queue_node_t’ # 修正后 Compilation successful. ``` --- ### 示例代码对比 **错误代码**: ```c #include <stdio.h> // 错误:参数使用了 static void print_node(static queue_node_t *node) { printf("Data: %d\n", node->data); } typedef struct { int data; } queue_node_t; int main() { ... } ``` **正确代码**: ```c #include <stdio.h> // 正确声明类型(前置声明) typedef struct queue_node_t queue_node_t; // 修正:删除 static void print_node(queue_node_t *node) { printf("Data: %d\n", node->data); } // 正确定义类型 struct queue_node_t { int data; }; int main() { ... } ``` --- ### 关键点总结 - ✅ **函数参数禁止存储类**:参数存储由编译器管理,无需手动指定。 - ✅ `typedef` **独立于存储类**:类型定义不应包含 `static`/`extern`。 - ✅ **前置声明解决依赖**:若类型未定义,需提前声明(如 `typedef struct queue_node_t queue_node_t;`)。 通过删除参数前的存储类说明符并确保类型正确定义,即可解决此错误[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值