是否"proper"定义宏用于单个函数
Is it "proper" to define macros for use in a single function
我不是在问是否可以 #define
函数内的宏。我知道这是可能的,并且宏是几乎(在某种程度上)复制粘贴的预处理机制。我要问的是 是否有广泛的理由避免在单个函数中使用宏,或者只是由代码库维护者决定什么是好的风格?
这是一个类似于我的用例的人为示例:
int main() {
/* ... */
#define POS(x, y) grid_array[width*(y) + (x)]
/* Use POS(x, y) in this function */
#undef POS
/* ... */
}
另一种提问方式是:其他C开发人员会点头表示理解还是摇头表示不屑?
编辑:
这不是“宏与函数”问题的重复。我了解两者之间的(部分)差异,例如MIN(a, b) (a)>(b)?(b):(a)
计算 a
和 b
两次。我在问对单个函数使用宏是否是一种好习惯。
答案(和评论)指出我的简单示例不值得使用宏。虽然我的实际用例并不那么简单,但我不得不同意。 “保存的输入”不值得复杂的代码。
如果你好奇的话,这是我的实际用例:
/* array represents a graph with max degree 2. These operations are domain specific. */
#define CONNECT(a, b, i) {array[8*(a) + i] = b; array[8*(b) + (i+4)%8] = a;}
除了十六进制值之外,任何编程语言的主要目的是使 reader 的意图和实现更加明显。程序是给人看的,机器翻译的。
就此而言,如果 POS(x,y)
只是节省您的打字时间,那对 reader 可能是有价值的,但您应该比作者更多地考虑 reader。任何有价值的节目都会比作家多 reader ,因此作为作家,您的义务是减轻他们的负担。
我不是在问是否可以 #define
函数内的宏。我知道这是可能的,并且宏是几乎(在某种程度上)复制粘贴的预处理机制。我要问的是 是否有广泛的理由避免在单个函数中使用宏,或者只是由代码库维护者决定什么是好的风格?
这是一个类似于我的用例的人为示例:
int main() {
/* ... */
#define POS(x, y) grid_array[width*(y) + (x)]
/* Use POS(x, y) in this function */
#undef POS
/* ... */
}
另一种提问方式是:其他C开发人员会点头表示理解还是摇头表示不屑?
编辑:
这不是“宏与函数”问题的重复。我了解两者之间的(部分)差异,例如MIN(a, b) (a)>(b)?(b):(a)
计算 a
和 b
两次。我在问对单个函数使用宏是否是一种好习惯。
答案(和评论)指出我的简单示例不值得使用宏。虽然我的实际用例并不那么简单,但我不得不同意。 “保存的输入”不值得复杂的代码。
如果你好奇的话,这是我的实际用例:
/* array represents a graph with max degree 2. These operations are domain specific. */
#define CONNECT(a, b, i) {array[8*(a) + i] = b; array[8*(b) + (i+4)%8] = a;}
除了十六进制值之外,任何编程语言的主要目的是使 reader 的意图和实现更加明显。程序是给人看的,机器翻译的。
就此而言,如果 POS(x,y)
只是节省您的打字时间,那对 reader 可能是有价值的,但您应该比作者更多地考虑 reader。任何有价值的节目都会比作家多 reader ,因此作为作家,您的义务是减轻他们的负担。