我在Stack Overflow中读到,将C文件包含到另一个C文件中并不是最佳做法。我想知道如何在C中创建模块化应用程序。
据我所知,建议您包含的是头文件,它不包含代码实现本身,只包含"函数调用"。
编译器如何知道在哪里找到相应的代码? 它会自动查找与 .h 文件同名的 .c 文件吗?
一般来说,如何在C应用程序中分离代码?
答案 0 :(得分:7)
一般来说,包含头文件而不是完整的c文件是最好的做法。您的编译器不需要知道任何其他代码的位置,只需要知道所使用函数的原型。
需要知道其他代码所在位置的流程部分是链接器,它不是编译器,而是包含在像gcc这样的完整解决方案中。
例如,在gcc中编译时,您可以添加链接器的引用,如注释中特别指出的那样。
关于与编译器gcc:
链接的示例,请归功于@jovit.royeca假设您有一个名为
的程序主文件string[] scopes = new string[] { YouTubeService.Scope.Youtube }; // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData% UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret } , scopes , "test" , CancellationToken.None , new FileDataStore("Daimto.YouTube.Auth.Store")).Result; YouTubeService service = new YouTubeService(new YouTubeService.Initializer() { HttpClientInitializer = credential, ApplicationName = "YouTube Data API Sample", });
您正在使用文件
demo.c
的某些功能。你那么 需要做的是创建一个名为bit.c
的标题,其中包含全局 来自bit.h
的变量和函数原型,然后将其包含到bit.c
demo.c
中,然后将其链接到gcc中 像这样:
#include "bit.h"
一些完整的解决方案,例如eclipse for c / c ++,会自动假设项目中的所有c文件都会链接到主文件中。例如。
答案 1 :(得分:4)
推荐的方法是创建具有特定功能的模块(.c文件);将它与一个类进行比较。要使其他模块可以使用此功能,您需要创建一个头文件,其中包含模块公开的函数,数据类型和变量(可用)。
要创建程序,您可以编写或重新使用这些模块并从主程序中调用它们(要调用它们,您应该open
头文件。)
makefile,或"项目"在IDE中告诉您的开发环境/编译器要编译哪些模块/ .c文件,然后链接器将它们链接到可执行文件中。
使用上述模块可以隐藏其他.c文件的实现(复杂性),