Clang:错误:非静态数据成员的使用无效

2024-03-13

这个 gcc 是否过于友善并且做了开发人员认为它会做的事情,或者 clang 对某些事情过于挑剔。我是否遗漏了标准中的一些微妙规则,其中 clang 对此的抱怨实际上是正确的

或者我应该使用第二位代码,这基本上就是 offsetof 的工作原理

[adrian@localhost ~]$ g++ -Wall -pedantic -ansi a.cc
[adrian@localhost ~]$ a.out
50
[adrian@localhost ~]$ cat a.cc
#include <iostream>

struct Foo
{
   char name[50];
};

int main(int argc, char *argv[])
{
   std::cout << sizeof(Foo::name) << std::endl;
   return 0;
}


[adrian@localhost ~]$ clang++ a.cc
a.cc:10:29: error: invalid use of non-static data member 'name'
   std::cout << sizeof(Foo::name) << std::endl;
                       ~~~~~^~~~
1 error generated.
[adrian@localhost ~]$ g++ -Wall -pedantic -ansi b.cc
[adrian@localhost ~]$ a.out
50
[adrian@localhost ~]$ cat b.cc
#include <iostream>

struct Foo
{
   char name[50];
};

int main(int argc, char *argv[])
{
   std::cout << sizeof(static_cast<Foo*>(0)->name) << std::endl;
   return 0;
}


[adrian@localhost ~]$ clang++ b.cc
[adrian@localhost ~]$ a.out
50

我发现添加-std=c++11停止抱怨。海湾合作委员会还不错 在任一版本中都有它。

现代 GCC 版本甚至在-std=c++98模式。然而,旧版本,比如我的 GCC 3.3.6,do抱怨并拒绝编译。

所以现在我想知道这段代码违反了 C++98 的哪一部分。

维基百科明确指出 C++11 中添加了这样的功能,并提到N2253 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html,它表示 C++98 标准最初并不认为该语法无效,但后来有意澄清不允许这样做(我不知道非静态成员字段在数据类型方面与其他变量有什么不同) 。一段时间后,他们决定使这种语法有效,但直到 C++11 才生效。

同一份文档提到了一个丑陋的解决方法,这也可以在整个网络上看到:

sizeof(((Class*) 0)->Field)

看起来就像简单地使用0, NULL or nullptr可能会因可能取消引用空指针而触发编译器警告(尽管事实上sizeof从不计算其参数),因此可以使用任意非零值来代替,尽管它看起来像一个反直觉的“魔法常量”。因此,在我的 C++ 优雅降级层中,我使用:

#if __cplusplus >= 201103L
    #define CXX_MODERN 2011
#else
    #define CXX_LEGACY 1998
#endif


#ifdef CXX_MODERN
    #define CXX_FEATURE_SIZEOF_NONSTATIC
    #define CxxSizeOf(TYPE, FIELD) (sizeof TYPE::FIELD)
#else
    // Use of `nullptr` may trigger warnings.
    #define CxxSizeOf(TYPE, FIELD) (sizeof (reinterpret_cast<const TYPE*>(1234)->FIELD))
#endif

用法示例:

// On block level:

class SomeHeader {
public:

    uint16_t Flags;

    static CxxConstExpr size_t FixedSize =
#ifdef CXX_FEATURE_SIZEOF_NONSTATIC
        (sizeof Flags)
#else
        sizeof(uint16_t)
#endif
    ;


}; // end class SomeHeader



// Inside a function:

void Foo(void) {

    size_t nSize = CxxSizeOf(SomeHeader, Flags);

} // end function Foo(void)

顺便说一下,请注意语法差异sizeof(Type) and sizeof Expression,因为它们在形式上并不相同,即使sizeof(Expression)有效——只要sizeof (Expression)已验证。所以,最正确和可移植的形式是sizeof(decltype(Expression)),但不幸的是它仅在 C++11 中可用;一些编译者提供了typeof(Expression)很长一段时间了,但这从来都不是标准的扩展。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clang:错误:非静态数据成员的使用无效 的相关文章

随机推荐

  • 无需 IDE 即可学习 C++

    我最近开始学习 C 并且对 IDE 和编译器的选择感到完全困惑 我擅长解释性语言 并且喜欢使用任何 IDE 或文本编辑器然后从命令行运行解释器的简单性 无论使用什么 IDE 一切都会按我的预期进行 因为我每次都使用相同的解释器 现在我已经开
  • 为什么比较器应该实现可序列化?

    Java 新手 在开发 Android 应用程序时学习它 我正在实现一个比较器来对文件列表和 android 文档进行排序say http developer android com reference java util Comparat
  • System.Runtime.Serialization.InvalidDataContractException:没有设置属性的方法

    正如错误所示 我的属性没有设置器 但我不需要设置器 它应该是只读的 编辑 制作设置器internal 这仍然可以在程序集中设置 但这是一个很好的技巧 当用于位于由其他人使用的程序集中的数据对象时效果很好 因为那些使用程序集将无法设置该属性
  • 如何在所选项目上启用工作流程状态“写入”?

    由于未授予工作流状态写入权限 某些项目没有写入访问权限 当我在 Access Viewer 中单击写入权限时 访问查看器通知我 由于工作流状态写入访问权限 所选用户没有访问权限 不幸的是 我无法通过安全编辑器 手动 设置它 任何人都可以阐明
  • 使用 xpath 和 telegram 即时视图提取、创建和附加

    我怎么能够create and append below a 使用上面代码中的标签XPath and 电报即时查看 https instantview telegram org docs功能 a href https expmle com
  • 如何获得 Aptana 的代码协助以与 Google Maps API v3 配合使用?

    有一个 Google 地图 API v3Visual Studio 智能感知助手 http gmapvsdoc codeplex com 这可能非常适合 Visual Studio 但 Aptana 基于 Eclipse 使用不同的 Jav
  • 发送密钥不起作用 selenium webdriver python

    我需要将文本发送到描述文本区域 有一些预定义的文本 单击后会被清除 我尝试在 sendkeys 之前使用 clear 或 click 但没有任何效果正常 它将向那里发送文本 但它仍然是灰色的 并且保存页面后出现错误 说明中没有文本 我可以使
  • 在 Java 中使用 String 和 Object 的 equals() 方法

    Object o1 new Object Object o2 new Object o1 o2 System out println o1 equals o2 它返回false 它可以返回true 如果评论被删除 为什么同样的事情不适用于S
  • 是否可以对我的 iPhone 应用程序进行逆向工程?

    我创建了一个 iPhone 应用程序 我想将编译后的 app 文件发送到我的客户端 以便他可以在他的设备上安装和测试这个 iPhone 应用程序 他是否有可能查看这个 app文件的内容 比如这个应用程序中使用的资源文件 图像 声音文件等 他
  • 在 PDF 中使用 Javascript 列出 XFA 对象的属性

    我正在尝试创建一个包含多个文本字段的 PDF 文档 这些文本字段的高度可以增长到某个最大值 由于项目的限制 我使用的是 Adob e Designer 7 它很高兴允许使用 Javascript 然而 XFA 中的对象与 HTML DOM
  • 验证不适用于 EntityManager.merge()

    我对我的实体几乎没有验证 例如 NotNull 还有一些一代人 比如 Id GeneratedValue strategy AUTO Column name ID private Long id Column GeneratedValue
  • 如何通过 CloudFront 将对象放入 S3

    我想通过 CloudFront 将图像上传到 S3 如果你看到关于CloudFront的文档 你可以发现cloud front提供了put方法来上传到cloudFront 可能会有人问我为什么使用云端上传到S3 如果你搜索一下 你就能找到解
  • 运算符和操作数的排列算法

    我在一个面试网站上看到了这个问题 我们有 4 个数字 即 n1 n2 n3 n4 我们可以将它们放置在任何 顺序 我们可以在它们之间使用数学运算符 最终结果为 24 为此编写一个算法 需要 4 个数字并返回 false 或 true 最终结
  • Eclipse 给出错误,最近更新后缺少 R.java 文件

    我已经更新了我的SDK and ADT到最新版本 我也更新了Eclipse to Kepler最新一篇之后Juno My ADT版本是22 0 在此更新之后 当我创建新项目时 出现错误 指出R cannot be resolved to a
  • 编写一个http嗅探器

    我想编写一个程序来通过数据包捕获提取系统访问的网站的 URL IP 地址 我认为该 URL 将出现在数据部分中 即不在任何标头中 ethernet ip tcp udp 此类程序有时称为http嗅探器 我不应该使用任何可用的工具 作为初学者
  • 无法解析 IntelliJ Idea IDE 中的符号 javafx.application

    我尝试创建一个JavaFXIntelliJ Idea IDE 中的应用程序 但我收到编译错误 java 包 javafx application 不存在 我已将项目 SDK 和项目语言级别更改为 Java 8 重新加载项目 但没有帮助 然后
  • 如何给 TriangleMesh 中的一些三角形着色?

    我想用不同的颜色为 TriangleMesh 的一些三角形着色 最简单的方法是什么 甚至可以在 fxml 文件中实现 java代码 import javafx application Application import javafx fx
  • 以最小尺寸分割字符串

    我正在编写一个 python 脚本 它将接受点分隔的版本号 它将把这个字符串分成单独的部分 使用句点 作为分隔符 我的脚本最多支持 4 个组件 例如1 2 3 4 然而 用户可以指定less or more组件数量超过 4 个 我的脚本需要
  • 在 Bootstrap 3 导航栏上使用 NAV 和 DIV 有什么区别?

    在最新的 Bootstrap 3 导航栏的示例中 我在网络上找到了各种示例 其中外部导航栏标记是 div class navbar navbar default navbar static top div 和其他例子正在使用
  • Clang:错误:非静态数据成员的使用无效

    这个 gcc 是否过于友善并且做了开发人员认为它会做的事情 或者 clang 对某些事情过于挑剔 我是否遗漏了标准中的一些微妙规则 其中 clang 对此的抱怨实际上是正确的 或者我应该使用第二位代码 这基本上就是 offsetof 的工作