C语言 一堆奇怪的语法错误[关闭]

avwztpqn  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(134)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答这个问题。
3天前关闭。
Improve this question
我有一个源文件,所有错误都突出显示:

#include <stdio.h>
#include <stdint.h>

#include "FAT12.h"

int main() {
    FILE* disk;
    fopen_s(&disk, "Test.vhd", "w+b");
    FAT12 fat; //C2065, C2146, E0020, E0065
    fat.format(); //C2224, E0020

    while (1);
    return 0;
}

字符串
和标题,错误只显示在输出中:

#pragma once
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

struct FAT12 {
#pragma pack(push, 1)
    struct Bootsector {
        uint8_t     jump[3] = {0xEB, 0x3C, 0x90}; //C2143, C2059
        uint8_t     oem[8] = { 'M', 'S', 'W', 'I', 'N', '4', '.', '1' };
        // ... //
    }; //C2059
#pragma pack(pop)
    Bootsector bootsector; //C2061, C2059
    uint8_t* fat;

    bool format(FILE* disk, const char label[12], unsigned int serial) { //C2061, C2059, C2059
                // ... //
    }
}; //C2059


我所有的错误:

C2143: syntax error: missing ";" before "="
C2059: syntax error: =
C2059: syntax error: }
C2061: syntax error: identifier "bootsector"
C2059: syntax error: ;
C2061: syntax error: identifier "format"
C2059: syntax error: ;
C2059: syntax error: <parameter-list>
C2059: syntax error: }
C2065: FAT12: undeclared identifier
C2146: syntax error: missing";" before identifier "fat"
C2224: expression to the left of ".format" must be a struct type or union


我不知道在这种情况下该怎么做,我想这是我的VS2022设置的问题。也许有一些不正确的类型。。仅突出显示源文件中的错误,其他错误仅显示在编译器输出中。

wn9m85ua

wn9m85ua1#

1.在struct FAT12 { };中有一个不是字段声明的变量。是否尝试创建命名空间?C语言没有命名空间。
1.初始设定式不属于型别宣告。它们初始化变量,因此它们属于变量定义。
1.您宣告名为struct Bootsector的型别,但使用名为Bootsector的型别。
1.使用名为bool的型别,而不先宣告它。
1.您没有传递任何必要的参数给format
1.删除无限循环while (1);
已修正:
FAT12.h

#include <stdbool.h>

extern bool FAT_format( FILE* disk, const char label[12], unsigned int serial );

字符串
FAT12.c

#include "FAT12.h"

typedef struct {
   uint8_t jump[3];
   uint8_t oem[8];
} FAT12_Bootsector;

static FAT12_Bootsector FAT12_bootsector = {
   .jump = { 0xEB, 0x3C, 0x90 },
   .oem  = { 'M', 'S', 'W', 'I', 'N', '4', '.', '1' },
};

extern bool FAT12_format( FILE* disk, const char label[12], unsigned int serial ) {
   // ...
}


在主程序中:

FAT12_format( ... );

bnl4lu3b

bnl4lu3b2#

这些错误指示语法问题和未声明的标识符。我已经一一列举出来了:

  1. C2143、C2059:据我所知,您不能在FAT12结构声明中初始化成员。相反,您应该在建构函式或个别函式中初始化它们。它应该如下所示:
struct FAT12 {
    // ...
    struct Bootsector {
        uint8_t jump[3];
        uint8_t oem[8];
        // ... //
        };
    // ...
};

字符串

  1. C2061:此错误与未声明的标识符有关。在FAT12结构体中使用引导扇区结构体之前,需要声明它,如下所示:
struct Bootsector; // Forward declaration

struct FAT12 {
    // ...
    struct Bootsector {
        // ...
    };
    // ...
};

  1. C2065、C2146:该错误指向在main中的声明之前使用FAT12结构,编译器无法找到FAT12结构的声明。确保头文件正确地包含在主目录中并共享同一目录。头文件名中也可能有错误。
  2. C2224:由于调用format()函数时未提供所需的参数,因此发生C2224错误。它应该类似于:
fat.format(disk, "Label", 12345); // Provide required arguments


1.另外,您已经将format()的返回类型设置为bool,这使其非void,但内部没有return语句。不过,我认为这只应该提出一个警告。
这些建议应该可以修正你的错误,如果你有更多的建议,请告诉我。

相关问题