指向字面值的指针

Jam*_*mes 16 c

假设我在头文件中定义了一个常量

#define THIS_CONST 'A'
Run Code Online (Sandbox Code Playgroud)

我想把这个常量写成一个流.我做的事情如下:

char c = THIS_CONST;
write(fd, &c, sizeof(c))
Run Code Online (Sandbox Code Playgroud)

不过,我会喜欢的简洁和清晰要做的是:

write(fd, &THIS_CONST, sizeof(char)); // error
                                      // lvalue required as unary ‘&’ operand
Run Code Online (Sandbox Code Playgroud)

有谁知道获取指向文字的指针的任何宏/其他技巧?我想要一些可以这样使用的东西:

write(fd, PTR_TO(THIS_CONST), sizeof(char))
Run Code Online (Sandbox Code Playgroud)

注意:我意识到我可以将我的常量声明为静态const变量,但是我不能在switch/case语句中使用它们.即

static const char THIS_CONST = 'A'
...
switch(c) {
  case THIS_CONST: // error - case label does not reduce to an integer constant
    ...
}
Run Code Online (Sandbox Code Playgroud)

除非有办法在案例标签中使用const变量?

ale*_*cov 30

在C89中无法直接执行此操作.您必须使用一组宏来创建这样的表达式.

在C99中,允许声明struct-or-union文字,并且可以使用类似的语法编写标量的初始化器.因此,有一种方法可以达到预期的效果:

#include <stdio.h>

void f(const int *i) {
    printf("%i\n", *i);
}

int main(void) {
    f(&(int){1});
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 这些结构称为*复合文字*(*ISO/IEC 9899:TC3,p75,§6.5.2.5,4*).我已经设法通过*this*回答来追踪这些信息.谢谢!我希望将来对C99规范的引用会有用! (7认同)

Fra*_*e_C 11

这些答案都过时了,除了评论之外,没有人提到最近的语言更新。

在使用复合文字的 C99-C11 编译器上,http://en.cppreference.com/w/c/language/compound_literal可以创建指向无名常量的指针,如下所示:

int *p = &((int){10});
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案明确引用 C99 并使用复合文字(尽管可以改进使用适当的术语“复合文字”而不是“结构或联合文字”) (3认同)

Dev*_*lar 5

获取指针的唯一方法是将文字放入变量(第一个代码示例).然后,您可以使用变量with write()和literal in switch.