我实际上正在使用这样的东西为我的错误函数制作constansts。这样很好还是我应该以其他方式做到这一点?
// declares 1 and 0 as a FALSE and TRUE
#define TRUE 1
#define FALSE !TRUE
// declares "error types"
const enum {
SYNTAX = 0,
ZERO_OPERATOR = 1,
ZERO_MINUS = 2
};
我如何使用"错误类型"代码中的常量:
If (!something) error(SYNTAX); // there is a switch in error function which prints the error
答案 0 :(得分:2)
在C中定义符号常量有几种不同的方法:
#define FOO something
enum { FOO=1, BAR=10, BLETCH=100 };
const double PI=3.14159265359;
每个都有其优点和缺点。
预处理器宏基本上只是文本替换,可用于简单值:
#define FOO 10
#define STR "This is a test"
#define PI 3.14159265359
或更复杂的表达
#define BAR (FOO * PI + BLETCH)
问题是预处理宏在预处理阶段被替换,因此在编译代码之后,符号FOO
,STR
,PI
和BAR
不再存在(这可能使组装级调试变得困难),并且他们不遵守范围规则(即,如果您在功能中创建宏,它的可见性不会仅限于此函数,它将对函数定义后面的任何代码可见。
您可以对整数值使用枚举常量:
enum { FOO = 1, BAR = 10, BLETCH = 100 };
预处理后不会替换它们,因此它们在调试器中可见。值在编译时是已知的,因此它们可用于switch
语句中的数组大小或大小写。枚举常量与变量和函数名称占用相同的名称空间,因此您不能对枚举常量和变量使用相同的符号。枚举常量执行遵守范围规则;如果在函数中定义enum
类型,那么枚举常量将不会在函数体外部显示。
您不能将枚举常量用于非int
值(字符串,浮点数,任何宽于int
的整数值)。
您可以使用const
- 限定变量:
const double PI = 3.14159265359;
const char * const STR = "This is a string constant";
const int FOO = 10;
几乎与预处理器宏一样灵活,符号不会被预处理器替换。与枚举常量一样,变量遵循范围规则。缺点是必须在运行时为所有这些对象分配存储,并且它们不能算作编译时常量,这意味着它们不能用于诸如switch
声明。
没有一个方案总是"最好&#34 ;;这真的取决于你需要什么。
就我而言,我使用enum
方法来处理相关的整数常量(错误代码,机器状态等),以及const
- 几乎所有其他的限定变量。我很少使用预处理器宏来表示符号常量。