我是 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
,但我认为你以后不能更改它,而且当我使用一堆这样的值时,它很快就会变得势不可挡
可以使用文件范围变量(“全局”)来实现此目的。
#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
是一个扩展为线程本地可修改的宏。