结构问题可能与代码块有关,但我不确定

struct issue probably related to codeblocks but I am not sure

在编写一个简单的程序时,我必须创建用于保存有关电影和电影导演的信息的结构,这两者在内部具有相同的变量但名称不同

struct Regista
{
char nome[30];
char cognome[30];
int nascita;
int doIexist;
};

typedef struct Regista regista;

struct Film
{
    char titolo[30];
    char reg[30];
    int anno;
    int doIexist;
};

我为两者都创建了一个数组,我想将它们作为参数传递给不同的函数,以便在这些数组中添加元素,现在我的问题是:我写错了:

int insertfilm(film arrayfilm[]);
int insertreg(regista arrayreg[]);
int main(){

//other stuff

film arrayfilm[SIZE];
regista arrayreg[SIZE];

//other stuff

  switch (mainMenuChoice)
    {
        case 1:
        {
            insertfilm(arrayfilm);
            break;

        }
        case 2:
        {
            insertreg(arrayfilm);
            break;
        }
//other stuff

应该注意的是,我传递了一个 struct film 数组,而它应该期望在 insertreg() 中有一个 struct regista 数组

我原以为它会报告错误类型的错误,但它却完全没有声音,运行它没有任何问题。

我的问题是:这是由我的 IDE(codeeblocks)还是 C 实现造成的?

Codeblocks 默认使用的 gcc/mingw 编译器在针对 C 语言类型兼容性违规给出编译器错误时并不严格。如果你 运行 使用默认设置,你会得到:

warning: passing argument 1 of 'insertreg' from incompatible pointer type

现在对于C语言来说,以上就足以让编译器兼容了。 C 不讲错误和警告,只讲诊断消息。

你的代码是无效的 C,因为两个结构只有在它们具有相同的结构标记、它们的所有成员都具有相同的类型并且它们具有相同的变量名时才兼容。您使用不同的结构标签和不同的变量名,因此它们不兼容。

形式上,由于类型不兼容,您的代码是 "constraint violation of the simple assignment rule" 并且编译器必须给您诊断消息,它确实给了您。

我强烈建议所有初学者在严格遵守标准和最大限度警告的情况下进行编译。对于 gcc,这意味着 -std=c11 -pedantic-errors -Wall -Wextra。迂腐的错误尤其会阻止代码编译成可执行文件,即使存在 C 语言违规也是如此。

具体在 Codeblocks 中:转到设置 -> 编译器,然后检查那里的相应选项,例如 "Enable extra compiler warnings [-Wextra]" 以启用 -Wextra