【发布时间】:2017-07-16 15:22:39
【问题描述】:
让第一个例子尽可能简单。
我想知道如何应用这个宏;像这里适用于例如printf("%s",macro(arg));
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#define type_string(name) { #name , name }
int main(void) {
char *hi = "Hello";
char *arr[]=type_string(hi);
printf("%s\n",type_string(hi));
return 0;
}
还有其他打印函数名称的方法: 我的最后一个解决方案是这个:
有没有更好的方法来优化这段代码,比如调整__func__?
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
// let's declare different functions for calculation
int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int divide(int x, int y);
// let's declare function pointers to different behaviors
//int (*functionPtr_1[4])(int,int); // basic form
typedef int (*myFuncDef)(int, int); // typedef as the basic form
int do_calculations (int (*functionPtr)(int, int)); // function receives function pointer with two args and returns int
int (*functionFactory(int n))(int, int);
int main() {
int m = 6;
int n = 10;
int res,i;
int (*functionPtr_arr[4])(int,int) = {&add, &sub, &mul, ÷};
for(i=0;i<4;i++)
{
res=(*functionPtr_arr[i])(4,5);
}
}
int add(int x, int y) {
int result = x + y;
printf("result for %s op is %d\n",__func__,result);
return result;
}
int sub(int x, int y) {
int result = x - y;
printf("result for %s op is %d\n",__func__,result);
return result;
}
int mul(int x, int y) {
int result = x * y;
printf("result for %s op is %d\n",__func__,result);
return result;
}
int divide(int x, int y) {
int result = x / y;
printf("result for %s op is %d\n",__func__,result);
return result;
}
【问题讨论】:
-
无论使用宏的上下文如何,它都通过文本替换来工作。在这种情况下,替换的上下文和结果是相当微不足道的。您觉得哪个具体部分难以理解?
-
如果不知道
fns数组的用途是什么,就不可能回答问题的第二部分。如果您只想“打印函数名称”,那么您可以使用第二个代码。如果目的是创建名称到函数的映射(实际上是fns的样子),那么您的第二个版本完全不适用,因为它不这样做。你具体想达到什么目的?不知道没有办法建议如何“优化”代码。 -
@AnT 对于你的第一个评论,这是一个文本替换,我想理解的是我现在明白了这个值被认为是数组中的元素组,所以作者如何初始化在结构数组中,我还了解到在元素数组中我可以用字符串、数字或函数名替换。但是我怎样才能用变量名代替呢?
-
我还是不明白问题的重点。文本结构相当简单,会产生像
{ "fna", fna }、{ "fnb", fnb }等sn-ps,它们后来在数组初始化中充当大括号括起来的初始化器。那么,您真正的问题是什么:文本替换如何工作或数组初始化中大括号封闭的初始化程序如何工作? “用变量名称替换”是什么意思?您到底指的是什么“变量名称”? -
@AnT 对于您的第二条评论,第二个代码是来自其中一位成员的建议示例,关于如何在我询问____func____ 的地方显示函数名称并将其替换为 for 循环main 函数,而不是替换每个函数。