复古编程:探索80年代Linux极客的编程世界

在现代编程环境中,享受着越来越强大的IDE,如.NET和Visual Studio,它们提供了丰富的功能和便利的图形界面。但有时候,不禁怀念起80年代的编程环境,那时候的程序员们使用着简单的文本编辑器和命令行工具,如libc和vim。本文将带回到那个时代,探索如何在现代编程环境中实现复古的编程技巧。

跨平台编程的挑战

现代编程语言和库,如C++11标准,提供了跨平台开发的能力。但是,当尝试使用libc和libc++,GNU glibc和WIN32库时,不得不面对跨平台编译到不同CPU架构的挑战。

解析程序选项

对于GUI开发者来说,可能不再需要考虑命令行参数,但对于控制台程序来说,程序选项仍然非常重要。GNU libc提供了getopt工具,而WIN32则有XGetopt。在本文中,将使用argv[1]来指示目录或文件路径。

目录与文件

在GNU glibc中,可以使用S_ISDIR宏来显示文件类型,而在Windows中,可以使用GetFileAttributes函数。以下是一个C++示例,展示了如何在不同平台上检查文件类型:

/* GNU libc */ struct stat buf; stat(path, &buf); if (S_ISDIR(buf.st_mode)) printf("\nit is a directory\n"); else printf("\nit is a file\n"); /* WIN32 */ switch (GetFileAttributes(path)) { case -1: printf("\ninvalid file\n"); break; case 18: case FILE_ATTRIBUTE_DIRECTORY: printf("\nit is a directory\n"); break; default: printf("\nit is a file\n"); break; }

获取文件名

在GNU libc中,可以使用basename函数,而在WIN32中,可以使用PathFindFileName函数来从文件路径中获取文件名。例如,/home/xzhai/hello.c和C:\hello.c的文件名都是hello.c。

遍历目录

在GNU libc中,可以使用opendir和readdir函数来遍历目录,而在WIN32中,可以使用FindFirstFile和FindNextFile函数。以下是一个C++示例,展示了如何在不同平台上遍历目录:

/* GNU libc */ DIR *dp; struct dirent *ep; dp = opendir(path); while (ep = readdir(dp)) { printf("\n%s", ep->d_name); } closedir(dp); /* WIN32 */ WIN32_FIND_DATA FindData; HANDLE hFind = INVALID_HANDLE_VALUE; char buffer[MAX_PATH]; memset(buffer, 0, MAX_PATH); sprintf(buffer, "\n%s\\*", path); hFind = FindFirstFile(buffer, &FindData); printf("\n%s", FindData.cFileName); while (0 != FindNextFile(hFind, &FindData)) { printf("\n%s", FindData.cFileName); } FindClose(hFind);

代码与注释的识别

在处理源代码时,需要区分包含代码或注释的行。以下是一个C++示例,展示了如何识别这些行:

/* ANSI C way */ while ('\0' != *line) { /* If there is a character not blank nor enter */ if (32 != *line && '\n' != *line) { /* the line including code or comment */ } line++; } /* ISO C++ way */ std::string::iterator iter; // walk through the std::string with iterator refer to char for (iter = obj_str.begin(); iter != obj_str.end(); iter++) { // If there is a character not blank nor enter if (32 != *iter && '\n' != *iter) { return true; } } return false;

C语言中的面向对象编程

面向对象编程不仅仅是C++的专利,C语言也可以实现。以下是一个C语言中的面向对象编程示例:

/* OOP in C */ typedef struct { int (*init)(); void (*cleanup)(); void (*write)(char *); } log_t; /* allocation for log_t* object */ log_t *log_init() { log_t *ret = NULL; ret = malloc(sizeof(log_t)); /* given the funtion pointer address */ ret->init = &m_init; ret->cleanup = &m_cleanup; ret->write = &m_write; return ret; } static FILE *m_fptr = NULL; static int m_init(); static void m_cleanup(); static void m_write(char *log);
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485