这是我正在处理的代码示例。
switch(n){
case 1:
char tcol[4][100]={"Canadian Order","Achat Francais","china"};
char trow[7][100]={"Item","Price","Qty","Total","Tax","Grand total"};
Htable(trow,tcol,7,4,"");
break;
case 2:
char tcol[3][100]={"Other column 1","2nd column"};
char trow[4][100]={"1st row","2nd row","Row 3"};
Htable(trow,tcol,4,3,"");
break;
case n:
...
}
基本上,我正在创建一个函数 Htable,它获取 HTML 表的行名称和列名称,第三个和第四个参数是行数和列数。
我遇到的问题是编译器认为我正在重新定义数组,即使每个定义只能从 switch 分支访问一次。错误如下:
./html2.c:118: error: redefinition of ‘tcol’
./html2.c:110: error: previous definition of ‘tcol’ was here
./html2.c:119: error: conflicting types for ‘trow’
./html2.c:111: error: previous declaration of ‘trow’ was here
对于我拥有的每个代码块来说,这种情况不断发生。我能想到的唯一部分解决方案如下:
char tcol[1][4][100]={"Canadian Order","Achat Francais","china"};
char trow[1][7][100]={"Item","Price","Qty","Total","Tax","Grand total"};
char trow[2][4][100]={"1st row","2nd row","Row 3"};
char tcol[2][4][100]={"Other column 1","2nd column"};
switch(n){
case 1:
Htable(trow[1],tcol[1],7,4,"");
break;
case 2:
Htable(trow[2],tcol[2],4,3,"");
break;
case n:
...
}
有没有一种简单的方法可以让 C 编译器接受它,而无需添加花哨的代码来分隔字符串?
最佳答案
Is there a simple way to do this where the C compiler accepts it without having to add fancy code to separate the strings?
在单独的子 block 中声明对象tcol, trow
。 @WhozCraig
void foo(int n) {
switch (n) {
case 1: { // add {
char tcol[4][100] = {"Canadian Order", "Achat Francais", "china"};
char trow[7][100] =
{"Item", "Price", "Qty", "Total", "Tax", "Grand total"};
Htable(trow, tcol, 7, 4, "");
break;
} // add }
case 2: { // add {
char tcol[3][100] = {"Other column 1", "2nd column"};
char trow[4][100] = {"1st row", "2nd row", "Row 3"};
Htable(trow, tcol, 4, 3, "");
break;
} // add }
}
}
请注意,tcol
的生命周期仅限于 block 。使static
永远持续下去。但我怀疑,根据更大的代码,可能需要一种新的方法 - 一些奇特。
抛开大小优化:考虑形成一个指向字符串的指针数组。
// char tcol[4][100] = {"Canadian Order", "Achat Francais", "china"};
const char *tcol[] = {"Canadian Order", "Achat Francais", "china", NULL};
还需要对 Htable()
进行更改。
关于c - 分配值表而不更改变量名称或编写花哨的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56159825/