当前位置: 首页 > 知识库问答 >
问题:

是C语法:T foo;有效的

申屠秦斩
2023-03-14

下面的代码是用Clang编译和运行的(在13、14和当前git头上进行了测试),但不是用GCC。

struct foo {
  int field<0, 1, int, 3>;
};

但我不明白它在宣告什么:这个领域是什么?

int field<0, 1, int, 3>;

我可以在字段里放任何我想要的东西


共有3个答案

宓茂才
2023-03-14

如果对foo字段成员没有任何类型的有效定义,这就不是有效的C语法。

下面的代码编译并运行

我试着编译了下面的程序:

#include <iostream>

struct foo {
  int field<0, 1, int, 3>;
};

int main(void){
    foo x;
    std::cout << x.field << std::endl;
}

铿锵v13。arch linux上的0.1编译器

clang++ -std=c++20 main.cc -o main

它会产生一些错误:

main.cc:9:20: error: no member named 'field' in 'foo'
std::cout << x.field << std::endl;
             ~ ^
1 error generated.

上述错误清楚地表明,字段不是模板。

然后,我尝试用gcc v11编译它。2.0,它给出了语法错误

main.cc:4:7: error: expected ‘;’ at end of member declaration
    4 |   int field<0, 1, int, 3>;
      |       ^~~~~
      |            ;
main.cc:4:12: error: expected unqualified-id before ‘<’ token
    4 |   int field<0, 1, int, 3>;

这是clangv9中的某种bug。0哪个可以做到这一点。

麹浩瀚
2023-03-14

如果没有字段的声明,这甚至不是有效的语法:

越俊艾
2023-03-14

假设字段不是已声明的模板,则程序的格式不正确。

但我不明白它在宣告什么:这个领域是什么?

Clang AST说:

`-CXXRecordDecl 0xdb6f20 <test.cpp:1:1, line:3:1> line:1:8 struct foo definition
  `-FieldDecl 0xdb7168 <line:2:3> col:7 'int'

clang AST用于具有int字段的程序;

`-CXXRecordDecl 0x168af90 <test2.cpp:1:1, line:3:1> line:1:8 struct foo definition
  `-FieldDecl 0x168b150 <line:2:3, col:7> col:7 field 'int'

所以,看起来Clang认为有一个int字段被声明了,但字段的名称是空的。这似乎可以通过初始化这个“未命名”字段得到证实:

foo f{0}; // compiles in Clang

第一个出现此错误的叮当版本似乎是9:https://gcc.godbolt.org/z/d386oz8v8

 类似资料:
  • 问题内容: Java具有格式字符串的概念,与其他语言的格式字符串非常相似。它用于诸如输出转换之类的JDK方法中。 我想知道在Java中是否有类似于C的输入转换方法? 问题答案: 看一下该站点,它解释了两种使用java中的控制台读取的方法,使用或使用System.in中的经典方法。 以下代码摘自引用的网站: - 问候。

  • 问题内容: 如何在Java中解码使用HttpServerUtility.UrlTokenEncode在C#中编码的字符串? 问题答案: 我尝试使用(ctor接受一个参数,说明编码/解码是否是url安全的),但事实证明它的实现方式与UrlTokenEncode / Decode不同。 我最终将C#实现迁移到Java:

  • 在C和C中都有效但具有不同语义学的语法示例是什么?换句话说,使用C和C编译器编译时产生不同输出的程序示例是什么?

  • 我是MySQL的新手。我有以下SQL查询,并尝试转换为mysql,为表create脚本中的日期列提供默认值。 但在MySQL中不支持。获取以下错误。 错误代码:1064。您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以了解第1行“(-1),sysutcdatetime())”附近使用的正确语法 此外,我还需要以以下格式获取日期'9999-12-31 23:59:59.99999

  • 问题内容: 是否有与C ++等效的Java Map keySet()? Java 方法返回“此映射中包含的键的设置视图”。 问题答案: 也许以下可能有用: 使用STL兼容序列(例如std :: vector,std :: deque或std :: list)的 make_key_set 函数的重载可以如下所示:

  • 问题内容: 我知道Java本身没有直接的等效项,但也许是第三方? 真的很方便。当前,我想实现一个迭代器,该迭代器生成树中的所有节点,这大约是带有yield的五行代码。 问题答案: 我知道的两个选项是2007年的Aviad Ben Dov的infomancers- collections库 和2008年的Jim Jimler的YieldAdapter库 (在另一个答案中也提到了)。 两者都允许您使用