C中常量的正确声明是什么?

时间:2016-04-20 16:02:55

标签: c constants

我实际上正在使用这样的东西为我的错误函数制作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

1 个答案:

答案 0 :(得分:2)

在C中定义符号常量有几种不同的方法:

  • 使用预处理器:#define FOO something
  • 使用枚举常量:enum { FOO=1, BAR=10, BLETCH=100 };
  • 使用const限定变量:const double PI=3.14159265359;

每个都有其优点和缺点。

预处理器宏基本上只是文本替换,可用于简单值:

#define FOO 10
#define STR "This is a test"
#define PI 3.14159265359

或更复杂的表达

#define BAR (FOO * PI + BLETCH)

问题是预处理宏在预处理阶段被替换,因此在编译代码之后,符号FOOSTRPIBAR不再存在(这可能使组装级调试变得困难),并且他们不遵守范围规则(即,如果您在功能中创建宏,它的可见性不会仅限于此函数,它将对函数定义后面的任何代码可见。

您可以对整数值使用枚举常量:

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 - 几乎所有其他的限定变量。我很少使用预处理器宏来表示符号常量。