C/C++ 覆盖作为文本指针的函数参数

问题描述 投票:0回答:1

我发现了这个构造,我不确定它是否有效。

#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”的终止空字符怎么样?有这个必要吗

c++ function arguments
1个回答
0
投票

是的,它是有效的(尽管在某些方面不是很好的风格)。

custom_text
是一个参数,这使得它成为函数print_text()内部的
局部变量
。参数使用调用中相应参数的值进行初始化(在本例中为
nullptr
)。

函数可以自由更改其任何局部变量的值。

C 样式字符串包含终止空字符

'\0'
。您无需担心它,因为它隐含在字符串文字中
"hello world"

使用

std::string
而不是原始的 C 风格字符串可能是更好的风格,但 C++ 处理 C 风格字符串没有太多问题。

您还可以使用默认参数值定义函数,而不是在函数体内编写该逻辑。

您应该更改的一件事是删除宏定义中的分号。分号成为宏扩展的一部分,所以你的语句

custom_text = DEFAULT_TEXT;

成为

custom_text = "hello world";;

在这种情况下,额外的分号不会引起任何问题,但在其他上下文中可能会导致语法错误或更糟。宏的扩展应该是一个有效的表达式。 (宏可以扩展到其他事物,但表达式可能是最常见的情况。)

© www.soinside.com 2019 - 2024. All rights reserved.