头文件声明extern char*数组报错:expected identifier or ‘(’ before ‘[’ token
问题分析:extern变量编译报错,改名后正常的原因与解决办法
问题场景
头文件protected_dirs.h中的声明:
#ifndef PROTECTED_DIRS #define PROTECTED_DIRS extern int PROTECTED_DIRS_COUNT; extern char* PROTECTED_DIRS[]; extern char* PROTECTED_DIRS_PASSWORDS[]; #endif
protected_dirs.c中的初始化:
#include <protected_dirs.h> const int PROTECTED_DIRS_COUNT = 2; const char* PROTECTED_DIRS[] = {"target", "IOS_Project"}; const char* PROTECTED_DIRS_PASSWORDS[] = {"1234", "1111"};
在ios_cd.c的checkPasswordForRoom函数中使用这些变量时编译报错,修改PROTECTED_DIRS变量名后错误消失。
原因分析
宏定义与变量名冲突
头文件里用PROTECTED_DIRS作为头文件保护的宏名,同时又把它用作数组变量名。预处理阶段宏会被全局替换,导致头文件中的extern char* PROTECTED_DIRS[];被替换成extern char* [];,这是明显的语法错误,编译器因此报错。改名后变量名和宏名不再重复,替换就不会破坏变量声明的语法。声明与定义的类型不匹配
头文件中声明的是extern char* PROTECTED_DIRS[];(非const),但protected_dirs.c里定义的是const char* PROTECTED_DIRS[](带const)。这种情况下,编译器会认为声明和定义的是两个不同的符号,即使宏冲突解决了,后续链接也可能出现问题。
解决办法
- 修改头文件保护宏的名称:把宏名改成和变量名完全不重叠的常规命名,比如
PROTECTED_DIRS_H,避免宏替换破坏变量声明:#ifndef PROTECTED_DIRS_H #define PROTECTED_DIRS_H extern const int PROTECTED_DIRS_COUNT; extern const char* PROTECTED_DIRS[]; extern const char* PROTECTED_DIRS_PASSWORDS[]; #endif - 保证声明与定义的类型一致:在头文件的extern声明中加上
const,和.c文件里的定义保持一致,确保编译器识别为同一个符号。
内容的提问来源于stack exchange,提问作者monamona
相关产品推荐
相关产品推荐

