extern char* array in header throws error:在“[”标记之前需要标识符或“(”

oxiaedzo  于 2023-03-22  发布在  其他
关注(0)|答案(2)|浏览(127)

我有一个头部,其中包含一个数组,我需要在我的代码中的多个地方:
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搜索没有显示任何有意义的东西,除了我自己的问题...

jckbn6z7

jckbn6z71#

这是你的问题:

#ifndef PROTECTED_DIRS
#define PROTECTED_DIRS

你已经定义了PROTECTED_DIRS是一个扩展为空的宏。通过使用不同的名称来修复它。我喜欢在最后使用_H

#ifndef PROTECTED_DIRS_H
#define PROTECTED_DIRS_H

或者,您可以使用#pragma once

#pragma once

这主要是一个风格问题,严格来说,#pragma once并不是可移植的,如果你可以通过不同的路径包含同一个文件,它就不起作用,但并不是每个人都关心这些。

ffscu2ro

ffscu2ro2#

对不起,我没注意,这是指示

#define PROTECTED_DIRS

与产生错误的数组的名称相同。
重命名指令中定义的名称或数组的名称。
另外,你需要在所有变量的声明中使用限定符const或删除它。

相关问题