是否可以在使用函数时调用程序中指定的值,而不将其写入函数本身?

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

我是 C 编程新手并开始学习,我想知道是否可以在多个函数中使用某种整数,这样通过在一个地方更改它,它就会在所有函数中自动更改功能有哪些?

例如,假设我有一个类似的函数:

int add_const(int number){
    int total;
    total = number - CONST;
    return total;
} //where CONST would be a value written somewhere else

int sub_const(int number){
    int total;
    total = number - CONST; //again, CONST is a value written somewhere else
    return total;
}

我希望

CONST
成为用户可以更改的值,例如通过使用
scanf
命令,并将其放在一个位置。这样的事可能吗?

我尝试使用

#define
,但我认为你以后不能更改它,而且当我使用一堆这样的值时,它很快就会变得势不可挡

c scope
1个回答
0
投票

可以使用文件范围变量(“全局”)来实现此目的。

#include <stdio.h>

static int shared = 42;

int add_shared(int number)
{
    return number + shared;
}

int sub_shared(int number)
{
    return number - shared;
}

int main(void)
{
    printf("Before: %d %d\n", add_shared(10), sub_shared(99));
    shared = 51;
    printf("After: %d %d\n", add_shared(10), sub_shared(99));
}
Before: 52 57
After: 61 48

(旁白:该示例使用的标识符略有不同。大写标识符通常用于实际常量或宏。小写

const
会与关键字冲突。)

有时文件作用域变量很有用,但它们通常会产生代码碎片和绑定过于紧密的函数。这两种情况都会导致代码难以推理和调试。通常的建议(尤其是对于初学者)是尽可能避免全局变量。

考虑以下程序,它使用块作用域变量产生几乎相同的输出,其好处是

add
sub
现在是纯函数,可以在其他上下文中重用。

#include <stdio.h>

int add(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b;
}

int main(void)
{
    int shared = 42;
    printf("Before: %d %d\n", add(10, shared), sub(99, shared));
    shared = 51;
    printf("After: %d %d\n", add(10, shared), sub(99, shared));

    printf("Other: %d\n", add(101, 101));
}

这是一个相当简单的示例,但随着程序的增长,控制范围变得越来越重要。


标准库中全局变量的一个显着用途是

errno
1

#include <errno.h>
#include <stdio.h>

int main(void)
{
    errno = ERANGE;
    perror("Whoops");
}
Whoops: Numerical result out of range

1。从技术上讲,

errno
是一个扩展为线程本地可修改的宏。

    

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