【问题标题】:Is it possible to have a pointer literal?是否有可能有一个指针文字?
【发布时间】:2014-06-13 19:42:37
【问题描述】:

在 C 中,字符串字面量的形式可以是

char *string = "string here";

整数字面量:

uint8_t num = 5;

长文字:

long long bigNum = 90322L; 

浮点字面量:

float decimal = 6.3f;

是一种拥有指针文字的方法吗?那是内存空间的文字地址。我正在做一些嵌入式项目的工作,需要硬编码一个 DMA 访问的值。我正在做类似以下的事情:

uint32_t *source = 0x08000000;

虽然编译并正常工作,但我收到以下编译器错误(我使用的是GCC 的变体):

cc0144: {D} warning: a value of type "int" cannot be used to initialize an entity of type "uint32_t *"
cc0152: {D} warning: conversion of nonzero integer to pointer

是否有正确的方法来做到这一点,还是我只需要接受这是 C 的事实?我知道我能做到:

uint32_t *source = (uint32_t *)0x08000000;

但这似乎非常不必要。行业这样做的方式是什么?我也想知道这个功能是否存在于 C++ 中。

【问题讨论】:

  • “但这似乎很没有必要” 请问您为什么认为没有必要?
  • 如果您愿意,可以在 C++11 中编写用户定义的文字运算符。
  • 空指针常量是地址文字。非空指针没有文字。一个像(uint32_t *)0x08000000 这样的整数常量是正确的方法——如果那是你系统上的一个有效地址。
  • @dyp 这似乎没有必要,因为我只是假设会有一个内置功能来执行此操作。我觉得人们需要经常这样做
  • @secretformula 你的意思是内置的写入固定地址的功能?不是标准功能,不。地址格式取决于架构。

标签: c++ c pointers literals


【解决方案1】:

在 C 和 C++ 中,唯一的指针字面量或常量为零。我们可以去draft C99 standard部分6.3.2.3指针

值为 0 的整数常量表达式,或这样的表达式 强制转换为 void * 类型,称为空指针常量。55)

和:

整数可以转换为任何指针类型。除了以前 指定,结果是实现定义的,可能不是 正确对齐,可能不指向被引用的实体 类型,并且可能是陷阱表示。56)

处理非零整数常量的正确方法是使用强制转换。

draft C++ standard 中的等效部分可能是 5.2.10 部分重新解释演员表,它说:

整数类型或枚举类型的值可以显式 转换为指针。转换为整数的指针 足够的大小(如果实现中存在这样的大小)并返回到 相同的指针类型将具有其原始值;之间的映射 指针和整数是由实现定义的。 [ 笔记: 除 3.7.4.3 中所述外,此类转换的结果将 不是安全派生的指针值。 ——尾注]

您需要查看3.7.4.3 部分了解所有详细信息。

对于指针文字参考,您需要2.14.7 指针文字部分,其中说:

指针字面量是关键字 nullptr。它是类型的prvalue std::nullptr_t。 [注意:std::nullptr_t 是一个独特的类型,它是 既不是指针类型也不是指向成员类型的指针;而是一个prvalue 该类型是一个空指针常量,可以转换为空 指针值或空成员指针值。见 4.10 和 4.11。 -结尾 注意]

【讨论】:

    【解决方案2】:

    不,不是。这是因为字面量是 有效的 值,而唯一有效的指针是对象的地址,即地址运算或有效指针上的指针运算的结果。

    您可以争辩说nullptr 关键字提供了一种“指针文字”; C++ 标准称之为。然而,它是 only 指针字面量,具有讽刺意味的是它不是指针类型。

    【讨论】:

    • [lex.nullptr]/1 "指针文字是关键字nullptr。" (其中“pointer-literal”指的是非终结符pointer-literal
    • -1:不同意。我认为 Shafik Yaghmour 给出了正确的答案。 “文字” 0 可用于表示标准 C 中的空指针。
    • @pablo1977:不。这根本不是“字面”的意思。文字0 的类型为int,没有歧义。它也是一个零值的常量表达式,它可以用来初始化一个指针。但这与文字是完全不同的。文字必须是所需类型的表达式。 (对于它的价值,接受的答案很好,但几乎不是重点。)
    • @KerrekSB:我再次不同意你的观点。 “文字”旨在成为一种语言“标记”,因此它根本没有任何类型。字符串文字没有类型 char*。首先,它是用双引号括起来的一系列特定字符(属于源环境)。该标记被预处理器识别,因此字符串文字没有类型。在稍后阶段转换为内存中具有类型char* 的对象。但是,我必须承认您对空指针常量问题是正确的。它被认为是一个常量整数表达式,具有整数类型。
    • @pablo1977:字符串文字的类型为“const char 数组”(或合适的宽字符)。
    【解决方案3】:

    在 C++ 中你能做如下的事情吗?

    uint32_t * source = reinterpret_cast<uint32_t*>(0x08000000);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 2020-03-16
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      相关资源
      最近更新 更多