在现代编程环境中,享受着越来越强大的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语言中的面向对象编程示例:
/*
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);