如果我有一对长函数:
#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。基本上任何在两个互补但简单的函数之间有很多代码重复的任务。
答案 0 :(得分:1)
为什么要预处理?你可以在代码中这样做,就像这样
#define READ 0
#define WRITE 1
void do_some_io( int action )
{
FILE *fp; int someVar = 1;
fp = fopen("results.dat", (action == WRITE ? "a" : "r") ); // open file
if (fp == NULL) {
printf("I couldn't open results.dat for io.\n");
exit(0);
}
if ( action == WRITE )
fprintf(fp, "%d\n", someVar); // write to file
else
fscanf(fp, "%d\n", &someVar); // read from file
fclose(fp); // and close
}
答案 1 :(得分:1)
有一种称为X宏的技术可以满足您的需求。您可以在维基百科(http://en.wikipedia.org/wiki/X_Macro)中查看其工作原理的基本信息。
根据维基解释,您可以创建一个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,您只需要更新VAR_LIST。
我没有尝试编译我的代码,因此可能存在一些语法错误,但这就是它的工作方式。
答案 2 :(得分:0)
看看你的代码,我会说它不值得努力,因为它有太多的差异(开放时的“a”与“r”,不同的错误信息,printf与scanf,额外的printf) 。如果有人在一年后必须阅读或调试它,整个事情将会变得混乱,甚至更加凌乱。
但是,出于教育目的:
#define MYFUNC(NAME,VARPART1,VARPART2) \
void NAME () { \
int a= 0; \
VARPART1; \
VARPART2; \
}
// make a print function
MYFUNC(printit, printf("%d", a), return);
// make a scan function:
MYFUNC(scanit, scanf("%d", &a), *global= a);
将使用一个宏创建两个不同的函数,例如,第一个将是:
void printit () {
int a= 0; \
printf("%d", a);
return;
}