header 中的 extern char* 数组抛出错误:预期标识符或‘[’标记之前的‘(’

问题描述 投票:0回答:2

我有这个标头,其中包含我在代码中多个位置需要的数组:

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 搜索没有显示任何有意义的东西,除了我自己的问题......

c compiler-errors header name-conflict
2个回答
2
投票

这是你的问题:

#ifndef PROTECTED_DIRS
#define PROTECTED_DIRS

您已经将

PROTECTED_DIRS
定义为一个扩展为空的宏。使用不同的名称修复它。我喜欢在最后使用
_H

#ifndef PROTECTED_DIRS_H
#define PROTECTED_DIRS_H

或者,您可以使用

#pragma once

#pragma once

这主要是风格问题。严格来说,

#pragma once
不是可移植的——如果你可以通过不同的路径包含相同的文件,它就不起作用——但并不是每个人都关心这些事情。


1
投票

对不起。我不专心。有指令

#define PROTECTED_DIRS

与产生错误的数组同名

重命名指令中定义的名称或数组的名称。

您还需要在所有变量声明中使用限定符

const
或将其删除。

© www.soinside.com 2019 - 2024. All rights reserved.