【问题标题】:Defining structs in C after main() function在 main() 函数之后在 C 中定义结构
【发布时间】:2019-11-30 03:40:47
【问题描述】:

我学了相当多的java,现在我想学C,我学了一点结构和typedef,但是当我把typedef放在main()函数之后并且从内部使用它时出现错误main() 函数。

有没有办法声明类型但不在 C 中定义它们,这样我就可以在 main() 函数之后保留我的代码,类似于函数? (我不确定这是否是好的做法,但我喜欢这样组织我的代码)

【问题讨论】:

标签: c struct typedef


【解决方案1】:

不要那样做。 C 代码旨在由编译器读取,它将在不断读取文件时了解新定义。在main() 下方移动东西没有任何意义。它也会让其他人感到困惑。

至于问题本身:在某些情况下,是的,你可以。如果您需要的一切都是前向声明,您可以这样做。但在大多数情况下,你会想要这个定义,所以它对你没有帮助。

例如,这将编译:

struct T;

int main(void)
{
    struct T * p = 0;
    return !!p;
}

// Later on you may define `struct T`

【讨论】:

    【解决方案2】:

    C 要求在使用之前声明一个类型。如果代码只是使用指向类型的指针,则代码不需要声明成员,这是前向声明。其他用法,例如按值传递类型或将其用作局部变量,则需要完整定义。

    C 项目通常使用提供类型定义的标题。这些都包含在 C 模块中。

    // header.h
    #ifndef _header_h_
    #define _header_h_
    
    struct DescribedType {
        int member;
        char* variables;
    };
    #endif
    
    // module.c
    #include "header.h"
    
    struct ForwardDeclaration;
    ForwardDeclaration* allocForward();
    
    int main(){
        DescribedType someType;
        ForwardDeclaration* someValue = allocForward();
        return 0;
    }
    
    struct ForwardDeclaration {
        int declaredLater;
    };
    

    【讨论】:

    • header.h 的标头保护错误(假设这是您的意图!)。另请注意,通常是文件/翻译单元/等。在 C 中很少被称为模块(现在它在 C++ 中确实具有具体含义)。
    • 噢!忽略了头球后卫的定义。谢谢你指出这一点。我熟悉 C 源文件被称为 90 年代和早期 2K 的模块,感谢您让我知道该术语已更改。
    • 不客气!是的,有些人使用这个词,但它没有改变,它从来都不是官方的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2015-08-26
    • 2012-10-20
    • 2021-06-05
    相关资源
    最近更新 更多