我发现了这个构造,我不确定它是否有效。
#include <iostream>
#define DEFAULT_TEXT "hello world"
void print_text(const char* custom_text) {
if(!custom_text) {
custom_text = DEFAULT_TEXT;
}
std::cout << custom_text << std::endl;
}
int main() {
print_text(nullptr);
return 0;
}
编译没有错误,其输出如预期的那样是“hello world”。
函数参数是一个包含指针的变量。通过调用该函数,它包含一个 nullptr。在函数内,参数变量被指向默认文本“hello world”的指针覆盖。它由预处理器宏定义,并在 if 语句内扩展,该 if 语句在 if 块内具有有限的范围。
这是一个有效的稳定结构吗? “hello world”的终止空字符怎么样?有这个必要吗
是的,它是有效的(尽管在某些方面不是很好的风格)。
custom_text
是一个参数,这使得它成为函数print_text()
内部的局部变量。参数使用调用中相应参数的值进行初始化(在本例中为
nullptr
)。
函数可以自由更改其任何局部变量的值。
C 样式字符串包含终止空字符
'\0'
。您无需担心它,因为它隐含在字符串文字中"hello world"
。
使用
std::string
而不是原始的 C 风格字符串可能是更好的风格,但 C++ 处理 C 风格字符串没有太多问题。
您还可以使用默认参数值定义函数,而不是在函数体内编写该逻辑。
您应该更改的一件事是删除宏定义中的分号。分号成为宏扩展的一部分,所以你的语句
custom_text = DEFAULT_TEXT;
成为
custom_text = "hello world";;
在这种情况下,额外的分号不会引起任何问题,但在其他上下文中可能会导致语法错误或更糟。宏的扩展应该是一个有效的表达式。 (宏可以扩展到其他事物,但表达式可能是最常见的情况。)