gpt4 book ai didi

c - 如何在c中使用带有三行语句的c宏

转载 作者:行者123 更新时间:2023-11-30 19:54:36 25 4
gpt4 key购买 nike

我想了解如何在代码中有效地使用 C 宏。有人可以指导我处理下面提到的代码吗?

#include<stdio.h>
#include<string.h>

void write_strongswan_conf(char buffer[1000],int buffer_size)
{
FILE *fp;
char delimiter[]="\n";
fp = fopen( "strongswan.txt" , "a" );
strcat(buffer,"\n");
fwrite(buffer, 1 ,buffer_size+1, fp );
printf("Data Written:%s",buffer);
fclose(fp);
}

int main ()
{
char wr_buffer[1000];
int wr_buffer_size =1;

strcpy(wr_buffer,"STRONG SWAN CONFIGURATION FILE");
wr_buffer_size = strlen(wr_buffer);
write_strongswan_conf(wr_buffer,wr_buffer_size);

strcpy(wr_buffer,"THIS IS THE SECOND LINE");
wr_buffer_size = strlen(wr_buffer);
write_strongswan_conf(wr_buffer,wr_buffer_size);

return(0);
}

这是一个小程序,用于将新字符串附加到文件末尾,我有大约 25 个字符串要添加到文件中。到目前为止,我必须重复编写下面提到的三行才能完成它。如果我的理解是正确的,我们将能够通过为这三行实现宏来减少 LOC。

有人可以指导我吗?

    strcpy(wr_buffer,"STRONG SWAN CONFIGURATION FILE");
wr_buffer_size = strlen(wr_buffer);
write_strongswan_conf(wr_buffer,wr_buffer_size);

最佳答案

这是我的镜头:

#define DO_SOMETHING(buf, str) \
do { \
const char *in = str; \
char *out = buf; \
const size_t len = strlen(in); \
strcpy(out, in); \
write_strongswan_conf(out, len);
} while (0)

这样编写宏的原因是什么?

  1. do {} while(0)并不是绝对必要的,但这是在条件内正确扩展多语句操作的唯一方法。例如,if (condition) DO_SOMETHING(...) 。查看more elaborate answer关于这个。

  2. 创建临时变量的原因是宏参数每次出现在宏体中时都会被求值。例如调用宏PRINT_ME_TWICE(intval) printf("%d\n", intval); printf("%d\n", intval);PRINT_ME_TWICE(i++)将打印不同的值,因为 intval参数被计算两次,从而执行后自增运算符 ( ++ ) 两次。您只能通过创建临时变量,将参数分配给它们,并且永远不再提及参数来保证求值问题不会发生。

注意:我反对使用 strcpy如果您不能保证输出缓冲区有足够的空间来保存结果字符串(加上 NULL 终止符)。

更新:

正如@Bill Lynch所述在注释中,如果您的变量与宏内部使用的名称相同,上面的版本可能仍然会给您带来麻烦。这称为 Variable Shadowing 。任何好的编译器都应该能够对此发出警告。例如,GCC 会警告您甚至在没有 -Wall 的情况下进行编译。或-Wextra 。目前,我们对宏所能做的最好的事情就是尝试通过在宏中添加变量名称前缀来最大程度地降低阴影风险。这可能是一个很好的做法,但并不是真正的解决方案。这就是它的样子:

#define DO_SOMETHING(buf, str) \
do { \
const char *DO_SOMETHING_in = str; \
char *DO_SOMETHING_out = buf; \
const size_t DO_SOMETHING_len = strlen(DO_SOMETHING_in); \
strcpy(DO_SOMETHING_out, DO_SOMETHING_in); \
write_strongswan_conf(DO_SOMETHING_out, DO_SOMETHING_len);
} while (0)

一个好的建议是尽可能用适当的函数替换宏,避免宏的所有晦涩

关于c - 如何在c中使用带有三行语句的c宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29167494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com