返回字面量的例子如下所示,利用一个整数码从四个处理中心选择一个。这个函数的目的是把处理中心的名字作为字符串返回。在本例中,它只是返回了字面量的地址:
char* returnALiteral(int code) {
switch(code) {
case 100:
return "Boston Processing Center";
case 200:
return "Denver Processing Center";
case 300:
return "Atlanta Processing Center";
case 400:
return "San Jose Processing Center";
}
}
这段代码会工作得很好。唯一需要记住的一点是我们并非总是将字符串字面量看做常量。也可以像下例这样声明静态字面量,我们增加了subCode
字段来选择不同的中心,这么做的好处是无需在不同的地方使用同一个字面量,也就不会因为打错字而引入错误了:
char* returnAStaticLiteral(int code, int subCode) {
static char* bpCenter = "Boston Processing Center";
static char* dpCenter = "Denver Processing Center";
static char* apCenter = "Atlanta Processing Center";
static char* sjpCenter = "San Jose Processing Center";
switch(code) {
case 100:
return bpCenter;
case 135:
if(subCode <35) {
return dpCenter;
} else {
return bpCenter;
}
case 200:
return dpCenter;
case 300:
return apCenter;
case 400:
return sjpCenter;
}
}
针对多个不同目的返回同一个静态字符串的指针可能会有问题。考虑下面的函数,这是在5.3.3节中开发的format
函数的变体。将一个部件的信息传递给函数,然后返回一个表示这个部件的格式化字符串:
char* staticFormat(const char* name, size_t quantity, size_t weight) {
static char buffer[64]; // 假设缓冲区足够大
sprintf(buffer, "Item: %s Quantity: %u Weight: %u",
name, quantity, weight);
return buffer;
}
为缓冲区分配64字节可能够,也可能不够,就本例的目的而言,我们会忽略这个潜在的问题。这种方法的主要问题用如下代码片段说明:
char* part1 = staticFormat("Axle",25,45);
char* part2 = staticFormat("Piston",55,5);
printf("%s\n",part1);
printf("%s\n",part2);
执行后得到如下输出:
Item: Piston Quantity: 55 Weight: 5
Item: Piston Quantity: 55 Weight: 5
staticFormat
两次调用都使用同一个静态缓冲区,后一次调用会覆写前一次调用的结果。