我有这个标头,其中包含我在代码中多个位置需要的数组:
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
编译器似乎需要一个函数定义,因为它需要一个标识符或一个
(
...这里有什么问题,我该如何解决?
编辑:
这很有趣...我尝试更改名称,现在编译错误消失了。
PROTECTED_DIR
这个名字有什么特别之处,快速的 ddg 搜索没有显示任何有意义的东西,除了我自己的问题......
这是你的问题:
#ifndef PROTECTED_DIRS
#define PROTECTED_DIRS
您已经将
PROTECTED_DIRS
定义为一个扩展为空的宏。使用不同的名称修复它。我喜欢在最后使用_H
。
#ifndef PROTECTED_DIRS_H
#define PROTECTED_DIRS_H
或者,您可以使用
#pragma once
:
#pragma once
这主要是风格问题。严格来说,
#pragma once
不是可移植的——如果你可以通过不同的路径包含相同的文件,它就不起作用——但并不是每个人都关心这些事情。
对不起。我不专心。有指令
#define PROTECTED_DIRS
与产生错误的数组同名
重命名指令中定义的名称或数组的名称。
您还需要在所有变量声明中使用限定符
const
或将其删除。