我实际上是用这样的东西,使我的错误函数康斯坦斯。这样行吗?还是我该做些别的?

// 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

最佳答案

在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)

问题是,在预处理阶段,预处理器宏被替换,所以在编译完代码后,符号FOOSTRPIBAR不再存在(这会使汇编级调试变得困难),并且它们不遵守范围规则(即,如果在函数内创建宏),那么其可见性将不限于该函数对函数定义之后的任何代码都是可见的)。
可以对整数值使用枚举常量:
enum { FOO = 1, BAR = 10, BLETCH = 100 };

这些在预处理后不会被替换,因此它们在调试器中可见。值在编译时是已知的,因此它们可以用于switch语句中的数组大小或大小写。枚举常量与变量名和函数名占用相同的名称空间,因此不能对枚举常量和变量使用相同的符号。枚举常量确实遵循作用域规则;如果在函数中定义enum类型,则这些枚举常量在函数体外部将不可见。
不能对非-int值(字符串、浮点数、任何大于int的整数值)使用枚举常量。
您可以使用限定变量:
const double PI = 3.14159265359;
const char * const STR = "This is a string constant";
const int FOO = 10;

几乎和预处理器宏一样灵活,符号不会被预处理器取代。与枚举常量一样,变量遵循作用域规则。缺点是必须在运行时为所有这些对象分配存储空间,而且它们不算作编译时常量,这意味着它们不能用于const语句中的case之类的事情。
没有一个计划总是“最好的”;它真的取决于你需要什么。
就我而言,我对相关的整数常量(错误代码、机器状态等)使用switch方法,对几乎所有其他内容使用enum限定变量。我很少对符号常量使用预处理器宏。

关于c - 什么是C中正确的常量声明?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36749331/

10-11 22:11
查看更多