c - 使用预处理器避免读/写函数中的代码重复

标签 c c-preprocessor

如果我有一对长函数:

#include <stdio.h>
#include <stdlib.h>

void writeData()
{
    FILE *fp; int someVar1 = 1; int someVar2 = 2; int someVar3 = 3;

    fp = fopen("results.dat", "a");     // open file

    if (fp == NULL) {
        printf("I couldn't open results.dat for appending.\n");
        exit(0);
    }

    fprintf(fp, "%d\n", someVar1);   // write to file
    fprintf(fp, "%d\n", someVar2);   // write to file
    fprintf(fp, "%d\n", someVar3);   // write to file
    fclose(fp);                     // and close
}

void readData()
{
    FILE *fp; int someVar1, someVar2, someVar3;

    fp = fopen("results.dat", "r");     // open file for reading
    if (fp == NULL) {
        printf("I couldn't open results.dat for reading.\n");
        exit(0);
    }

    fscanf(fp, "%d\n", &someVar1);       // read from file
    fscanf(fp, "%d\n", &someVar2);       // read from file
    fscanf(fp, "%d\n", &someVar3);       // read from file

    fclose(fp);     // and close

    printf("someVar: %d %d %d\n", someVar1, someVar2, someVar3);
}

int main(void)
{
    writeData();
    readData();

    return 0;
}

有没有一种方法可以(ab)使用预处理器来避免重复读写代码?换句话说,有没有办法生成 fprintf(fp, "%d\n", someVar)fprintf(fp, "%d\n", someVar) 分别在 write()read() 函数中?

编辑:这同样适用于分配/取消分配整个内存负载,例如http://pastebin.com/wdAnHfWx .基本上任何在两个互补但简单的函数之间有大量代码重复的任务。

最佳答案

有一种称为 X 宏的技术可能适合您的需要。您可以在维基百科 (http://en.wikipedia.org/wiki/X_Macro) 中查看其工作原理的基本信息。

按照 wiki 说明,您可以创建一个 VAR_LIST,然后将此列表扩展为可读或可写。

#define MY_VAR_LIST(ENTRY)  \
    ENTRY(var1) \
    ENTRY(var2) \
    ENTRY(var3)

#define EXPAND_AS_DEFINITION(my_var) int my_var;
#define EXPAND_AS_WRITE(my_var) fprintf(fp, "%d\n", (my_var));
#define EXPAND_AS_READ(my_var) fscanf(fp, "%d\n", &(my_var));

int my_function_write()
{
    MY_VAR_LIST(EXPAND_AS_DEFINITION)
    FILE *fp;
    fp = fopen("results.dat", "a");     // open file

    if (fp == NULL) {
        printf("I couldn't open results.dat for appending.\n");
        exit(0);
    }

    MY_VAR_LIST(EXPAND_AS_WRITE)
    fclose(fp);
}

int my_function_read()
{
    MY_VAR_LIST(EXPAND_AS_DEFINITION)
    FILE *fp;
    fp = fopen("results.dat", "r");     // open file

    if (fp == NULL) {
        printf("I couldn't open results.dat for appending.\n");
        exit(0);
    }

    MY_VAR_LIST(EXPAND_AS_READ)
    fclose(fp);
}

因此,要附加一个新变量,您只需要更新您的 VAR_LIST。

我没有尝试编译我的代码,所以可能存在一些语法错误,但它应该是这样工作的。

关于c - 使用预处理器避免读/写函数中的代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16936514/

相关文章:

ios - Objective-C 如何根据字符串比较结果定义宏

c - 模拟 GCC 语句表达式

c - 从 Matlab 运行 C 可执行文件

c - 使用 MinGW 的 C 中的段错误

c - 如何检查CSP或PKCS创建的证书和 key 对?

c - 如何使用以下预处理器语句

比较c中字符串数组中的数据

c++ - 对宏的唯一可识别调用

c++ - 如何在 Visual Studio C++ 2005 中处理所有#include 指令?

c++ - 使用#ifndef 时具体定义了什么