表达式必须是指向完整对象类型的指针,为什么在这种情况下会出现此错误?

Expression must be a pointer to a complete object type, why do I get this error in this situation?

这是我的情况的简化:

header.h

#DEFINE NUMBER 3
extern char reserved[][];

definer.c

char reserved[NUMBER][4] = {"WOW","LOL","K"}

sign.c

#include "header.h"
void theFunctionWithTheError{
    
       if (reserved[1] == "I love Whosebug"){ /**THE LINE OF THE ERROR*/
       return;
    }
}

在sign.c中,我得到错误Expression must be a pointer to a complete object type 对于单词 reserved

你建议我做什么?

  1. 错误消息说你不能有效地使用声明 extern char reserved[][]; 因为编译器至少需要数组的第二个维度来知道如何访问数组的部分——所以它需要 extern char reserved[][4];。通过该声明,很明显 "I love Stack Overflow"(无论分词和大写)太长而不能等于数组中的任何字符串,但这有点偶然。

  2. 你不能像那样有用地比较字符串——你需要使用 strcmp()。请参阅 How do I check if a value matches a string? and How do I properly compare strings? 以及许多其他可能的 SO 问题。

    你有:

    if (reserved[1] == "I love Whosebug")
    

    你需要:

    if (strcmp(reserved[1]), "I love Stack Overflow") == 0)
    

    或同等学历。使用集合 ==!=>=<= 中的任何 op 显式比较 strcmp(A, B)0 的结果>< 与您从 A op B 获得的结果匹配,如果字符串是 C 中的真实 built-in 类型。

您的代码有问题:

  1. 缺少参数列表,即使为空,也必须在函数定义中提供括号;

  2. C 中的字符串比较必须使用函数 strcmp() 来执行。不能对字符串使用 == 运算符。

    #include <string.h>

    #define NUMBER 3

    char reserved[NUMBER][4] = { "WOW", "LOL", "K" };

    void theFunctionWithTheError(void){

       if (strcmp("I love Whosebug", reserved[1]) == 0)
       {
          return;
       }
   }