如何在C语言函数中打印传入的二维矩阵变量名
解决C语言函数中打印传入二维矩阵变量名的问题
你遇到的问题根源在于宏的字符串化操作是在预处理阶段完成的,而函数的形参a是编译阶段的局部标识符。当你在saddle函数里调用VariableName(a)时,宏只会把当前作用域里的a转成字符串,完全和调用时传入的实参(比如A、B)无关——因为函数调用时,实参只是把矩阵的地址传递给形参a,两者的名字没有任何关联。
解决方案
要解决这个问题,需要在调用函数的阶段就把实参的变量名转成字符串,再传递给函数。可以通过一个包装宏来实现:
- 修改
saddle函数,新增一个参数用于接收矩阵的名字字符串:
#include <stdio.h> void saddle(int a[][100], const char* mat_name, int m, int n) { printf("The saddle points of the matrix %s are: \n", mat_name); // 这里添加鞍点查找的业务逻辑 }
- 定义一个包装宏,在调用时自动把矩阵变量名转成字符串:
#define CALL_SADDLE(mat, rows, cols) saddle(mat, #mat, rows, cols)
- 调用时使用这个宏代替直接调用
saddle函数:
int main() { int A[3][100] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int B[2][100] = {{10, 20}, {30, 40}}; CALL_SADDLE(A, 3, 3); CALL_SADDLE(B, 2, 2); return 0; }
运行这段代码,会输出:
The saddle points of the matrix A are: The saddle points of the matrix B are:
补充说明
- 这个方法仅适用于直接传递变量名的场景,如果传入的是表达式(比如
&arr[0]),#mat会把整个表达式转成字符串,而非变量名。 - 宏的字符串化操作
#var会直接把预处理阶段的标识符转成字符串,因此必须在调用点完成这个操作,才能获取到实参的名字。
内容的提问来源于stack exchange,提问作者insipidintegrator
相关产品推荐
相关产品推荐

