目前有許多代碼僅在 1 個運算子中有所不同(例如 、- 、* 、/ 、& 、| 、== 等...)是否可以將這些代碼組合成 C 中的一個通用函式,并將運算子作為引數? 謝謝你。
示例 1
for (int y = 0; y < v3->y; y )
{
for (int x = 0; x < v3->x; x )
{
v3->num[y][x] = v1->num[y][x] v2->num[y][x];
}
}
示例 2
for (int y = 0; y < v3->y; y )
{
for (int x = 0; x < v3->x; x )
{
v3->num[y][x] = v1->num[y][x] * v2->num[y][x];
}
}
示例 3
for (int y = 0; y < v3->y; y )
{
for (int x = 0; x < v3->x; x )
{
v3->num[y][x] = v1->num[y][x] | v2->num[y][x];
}
}
不確定是否可能,但預計會有這樣的事情......
for (int y = 0; y < v3->y; y )
{
for (int x = 0; x < v3->x; x )
{
v3->num[y][x] = v1->num[y][x] operator v2->num[y][x];
}
}
uj5u.com熱心網友回復:
正如 PMF 在評論中提到的那樣,您可以使用宏 - 要么只包裝v3 = v1 OP v2計算,要么包裝整個回圈,例如這里 ( godbolt )
// NB: v1, v2, v3 need to be simple identifiers, this macro is not safe otherwise
#define VLOOP(v3, v1, v2, op) \
for (int y = 0; y < v3->y; y ) \
for (int x = 0; x < v3->x; x ) \
v3->num[y][x] = v1->num[y][x] op v2->num[y][x]
typedef struct {
int x;
int y;
int **num;
} V;
void compute_sum(V* v3, V* v1, V* v2) {
VLOOP(v3, v1, v2, );
}
void compute_product(V* v3, V* v1, V* v2) {
VLOOP(v3, v1, v2, *);
}
void compute_division(V* v3, V* v1, V* v2) {
VLOOP(v3, v1, v2, /);
}
// etc...
uj5u.com熱心網友回復:
你可以試試這個:
#define DO_OP(op) for (int y = 0; y < v3->y; y ) \
{\
for (int x = 0; x < v3->x; x )\
{\
v3->num[y][x] = v1->num[y][x] op v2->num[y][x];\
}\
}
這不會減少生成代碼的大小,但源代碼會平滑得多。用于
DO_OP(*)
DO_OP(/)
// etc...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416408.html
標籤:
上一篇:使用*(p 1)將值20分配給記憶體中的下一個地址并且列印不會產生輸出
下一篇:在"xdpebpfSEC("tracepoint/xdp/xdp_devmap_xmit")"中,什么是xdp_devmap_xmit-這個跟蹤是否意味著某些內
