【发布时间】:2009-10-14 07:09:43
【问题描述】:
假设我在头文件中定义了一个常量
#define THIS_CONST 'A'
我想将此常量写入流。我会这样做:
char c = THIS_CONST;
write(fd, &c, sizeof(c))
但是,为了简洁明了,我希望 做的是:
write(fd, &THIS_CONST, sizeof(char)); // error
// lvalue required as unary ‘&’ operand
有谁知道获取指向文字的指针的任何宏/其他技巧?我想要一些可以像这样使用的东西:
write(fd, PTR_TO(THIS_CONST), sizeof(char))
注意:我意识到我可以将我的常量声明为静态 const 变量,但是我不能在 switch/case 语句中使用它们。即
static const char THIS_CONST = 'A'
...
switch(c) {
case THIS_CONST: // error - case label does not reduce to an integer constant
...
}
除非有办法在 case 标签中使用 const 变量?
【问题讨论】:
-
唯一想到的是链接器技巧。你用的是什么编译器?如果您可以在链接器命令中引入一些绝对指针值,则可以使用 (void *)0x00000004 作为整数值 '4' 和字符。它不是便携式的。如果您使用的是 Windows,请查看名为 .cxa - .cxz 的 C++ 构造函数列表,该列表由 MS Visual C 标准 C 库在初始化期间使用。这类似于我正在谈论的那种链接器技巧。不同之处将导致输出图像包含一些不可重定位的地址,您可以将其转换为 int。;)
-
有趣的想法 - 这比我想要的要多一点头骨,但仍然很有趣。我正在使用 gcc,我的代码必须在 Linux 和 Solaris 下编译:)
-
除了想在case语句中使用它,为什么还需要它?在下面的一个答案中,您说您还希望它适用于浮点数,但无论如何您都不能将浮点数用作 case 语句表达式。
-
关于浮点数的好点 - 但整数仍然适用。我唯一需要的是在案例陈述中。然而,这个问题的动机并不是因为“需要它”,而是只是想看看它是否可以通过一些 C 宏技巧(并且很清楚文字与变量不同并且不能获取其地址) .无论如何,谢谢大家的贡献-我想简短的回答是“不”,没有公认的技巧可以让编译器将文字值放入内存位置并获取指向它的指针,也没有干净和线程安全的方法在运行时执行。
标签: c