我有一个头部,其中包含一个数组,我需要在我的代码中的多个地方:
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
的文件中的代码:
int checkPasswordForRoom(char* targetDir, char* password){
int accessGranted = 0;
int directoryRestricted = 0;
for (int i = 0; i < PROTECTED_DIRS_COUNT; i++) {
if (strcmp(PROTECTED_DIRS[i], targetDir) == 0) {
directoryRestricted = 1;
if (strcmp(PROTECTED_DIRS_PASSWORDS[i], password) == 0) {
accessGranted = 1;
}
}
}
if (directoryRestricted) {
return accessGranted;
} else {
return 1;
}
}
这对我来说似乎很简单,但后来我得到了这个错误,这让我很困惑。一开始我在checkPasswordForRoom
函数中有一个局部变量,但后来意识到我还需要其他地方的受保护目录列表。我创建了一个带有一个小c文件的头文件来初始化值,但突然间我的代码将无法编译了。
这是我从编译器中得到的输出,对我来说毫无意义:
gcc -Iutils -Imodules -Wall -Wextra -c utils/ios_cd.c -o build/utils/ios_cd.o
In file included from utils/ios_cd.c:10:
utils/protected_dirs.h:6:28: error: expected identifier or ‘(’ before ‘[’ token
6 | extern char* PROTECTED_DIRS[];
| ^
utils/ios_cd.c: In function ‘checkPasswordForRoom’:
utils/ios_cd.c:45:34: error: expected expression before ‘[’ token
45 | if (strcmp(PROTECTED_DIRS[i], targetDir) == 0) {
| ^
make: *** [Makefile:11: build/utils/ios_cd.o] Error 1
看起来好像编译器期望一个函数definion,因为它想要一个标识符或(
...这里有什么问题,我如何修复这个问题?
编辑:
这很有趣...我试着改变名字,现在编译错误消失了。PROTECTED_DIR
名字的特殊之处在于,快速的ddg搜索没有显示任何有意义的东西,除了我自己的问题...
2条答案
按热度按时间jckbn6z71#
这是你的问题:
你已经定义了
PROTECTED_DIRS
是一个扩展为空的宏。通过使用不同的名称来修复它。我喜欢在最后使用_H
。或者,您可以使用
#pragma once
:这主要是一个风格问题,严格来说,
#pragma once
并不是可移植的,如果你可以通过不同的路径包含同一个文件,它就不起作用,但并不是每个人都关心这些。ffscu2ro2#
对不起,我没注意,这是指示
与产生错误的数组的名称相同。
重命名指令中定义的名称或数组的名称。
另外,你需要在所有变量的声明中使用限定符
const
或删除它。