前向声明允许静态类型的程序指示符号的类型和名称,而不实际定义它。
我以为我很了解 C 语法,直到我尝试编译以下代码: 无效 f(int i; 双 x) { } 我预计编译器会出错,它确实出错了,但我没有收到错误消息: 测试...
我有一个已经存在了一段时间的大型代码库,我正在尝试通过重构来整理它。 我想做的一件事是找到所有可以转发声明内存的标头...
bash 中是否有这样的东西,或者至少有类似的东西(解决方法),例如在 C / C++ 中众所周知的前向声明? 或者有这样的事情,因为例如它总是
是否允许在友元声明中为模板参数提供默认值? A类{ 整数值; 民众: 模板朋友无效foo(); }; Visual Studio 2015 看起来...
在 .h 中如果我有: #pragma 一次 #包括 #include“yyyy.h” AAAAAA 级; BBBBBB 级; ZZZZZZ类 { 民众: // ETC }; 使用 AAAAAA 类;正在向前宣布 cl...
我想使用尚未定义的 typedef 结构,但它是稍后定义的。 有没有类似结构体原型的东西? 文件容器.h // 我会在这里放置一种结构原型 typedef 结构...
假设你有一个函数: void func(CustomFoo& arg); 有人抱怨编译器无法识别该类。您可以这样做,而不是前向声明: 无效函数(st...
我知道,一般来说,我们可以在 C++11 中前向声明枚举。 那么,为什么会这样: 枚举 kind_t { kind1, kind2 }; 模板 结构 foo {}; 模板 <> 结构 foo 我知道,一般来说,我们可以在 C++11 中前向声明枚举。 那么,为什么会这样: enum kind_t { kind1, kind2 }; template <kind_t Kind> struct foo {}; template <> struct foo<kind1> { enum named : int; }; enum foo<kind1>::named : int { named1 = 123, named2 = 456, }; GCC(12.1)编译失败?错误是(Godbolt): <source>:9:6: error: cannot add an enumerator list to a template instantiation 9 | enum foo<kind1>::named : int { | ^~~~~~~~~~ ASM generation compiler returned: 1 <source>:9:6: error: cannot add an enumerator list to a template instantiation 9 | enum foo<kind1>::named : int { | ^~~~~~~~~~ 这似乎可以用 clang++ 14.0 编译良好... 当前代码中的前向声明枚举遇到错误,而 clang 和 msvc 似乎可以很好地处理它。 enum kind_t { kind1, kind2 }; template <kind_t Kind> struct foo {}; template <> struct foo<kind1> { enum named : int; }; enum foo<kind1>::named : int { named1 = 123, named2 = 456, }; 如果您想让代码与 GCC (12.1) 兼容,请尝试直接在类专业化内部定义枚举而不使用前向声明: enum kind_t { kind1, kind2 }; template <kind_t Kind> struct foo {}; template <> struct foo<kind1> { enum named : int { named1 = 123, named2 = 456, }; }; 现场演示
为什么编译器不允许我转发声明 typedef? 假设这是不可能的,那么保持我的包含树较小的最佳实践是什么?
如何在 Python 3.6 中将 ForwardRef 作为参数传递给 TypeVar?
我正在开发一个当前支持 Python 3.6+ 的库,但在 Python 3.6 的类型模块中如何定义前向引用时遇到了一些问题。我已经在本地 Wi 上设置了 pyenv...
我目前正在 C++ 中使用 elfutils 库,我正在努力解决一些应该显而易见的事情。 这是显示我的问题的 MCVE: 文件.cpp 结构Elf64_Sym; #包括 我目前正在使用 C++ 的 elfutils 库进行工作,我正在努力解决一些应该显而易见的事情。 这是一个 MCVE 显示了我的问题: 文件.cpp struct Elf64_Sym; #include <elf.h> 当然,在完整的代码中,前向声明是在 .hpp 文件中完成的,而 <elf.h> 包含是在 .cpp 文件中完成的,但这个小示例重现了完全相同的问题。您可以尝试使用以下命令行来编译它g++ file.cpp,您将收到以下错误: In file included from /usr/include/libelf.h:36, from file.cpp:3: /usr/include/elf.h:538:3: error: conflicting declaration 'typedef struct Elf64_Sym Elf64_Sym' 538 | } Elf64_Sym; | ^~~~~~~~~ file.cpp:1:8: note: previous declaration as 'struct Elf64_Sym' 1 | struct Elf64_Sym; | ^~~~~~~~~ 使用 gcc 可以很好地编译(在 C 中也是如此),但在 g++ 中则不行(在 C++ 中也是如此)。 您是否有允许在 C++ 中向前声明 Elf64_Sym 结构的解决方案? 为了完整起见,这里是 <elf.h> 中该结构的定义: typedef struct { Elf64_Word st_name; /* Symbol name (string tbl index) */ unsigned char st_info; /* Symbol type and binding */ unsigned char st_other; /* Symbol visibility */ Elf64_Section st_shndx; /* Section index */ Elf64_Addr st_value; /* Symbol value */ Elf64_Xword st_size; /* Symbol size */ } Elf64_Sym; 更新了MCVE 这里有一个 MCVE 显示了我的问题(感谢 @user12002570 指出我之前的 MCVE 不正确): 文件.hpp #ifndef FILE_HPP #define FILE_HPP #include <stdint.h> struct Elf64_Sym; uint64_t getSize(Elf64_Sym * ptr); #endif 文件.cpp #include "file.hpp" #include <elf.h> uint64_t getSize(Elf64_Sym * ptr) { return ptr->st_size; } 您可以尝试使用以下命令行来编译它g++ -c file.cpp,您将收到以下错误: /usr/include/elf.h:538:3: error: conflicting declaration 'typedef struct Elf64_Sym Elf64_Sym' 538 | } Elf64_Sym; | ^~~~~~~~~ In file included from file.cpp:1: file.hpp:6:8: note: previous declaration as 'struct Elf64_Sym' 6 | struct Elf64_Sym; | ^~~~~~~~~ 您是否有允许在 C++ 中向前声明 Elf64_Sym 结构的解决方案? 为了完整起见,这里是 <elf.h> 中该结构的定义: typedef struct { Elf64_Word st_name; /* Symbol name (string tbl index) */ unsigned char st_info; /* Symbol type and binding */ unsigned char st_other; /* Symbol visibility */ Elf64_Section st_shndx; /* Section index */ Elf64_Addr st_value; /* Symbol value */ Elf64_Xword st_size; /* Symbol size */ } Elf64_Sym; 回答已编辑的问题 这些是解决问题的步骤。 步骤1 您可以直接从源文件#include "file.hpp"中注释掉file.cpp。 第2步 在标题中 file.hpp 删除前向声明 struct Elf64_Sym。 第3步 在标题中file.hpp将函数声明更改为: //---------------vvvvvv--------------------->used struct here uint64_t getSize(struct Elf64_Sym * ptr); 工作演示 老问题的回答 您是否有允许在 C++ 中前向声明 Elf64_Sym 结构的解决方案? 您根本不需要在源文件中写入 struct Elf64_Sym,因为您已经包含了具有所需 typedef 的标头。 您可以直接创建Elf64_Sym类型的对象,方法是: Elf64_Sym object; 在源文件中。 工作演示 方法2 如果允许修改标头elf.h,那么编写结构体的更多 C++ 方式将是不使用 typedef: //no need for typedef here struct Elf64_Sym { Elf64_Word st_name; /* Symbol name (string tbl index) */ unsigned char st_info; /* Symbol type and binding */ unsigned char st_other; /* Symbol visibility */ Elf64_Section st_shndx; /* Section index */ Elf64_Addr st_value; /* Symbol value */ Elf64_Xword st_size; /* Symbol size */ } ; 然后你可以在源文件中写入struct Elf64_Stm;,没有任何问题。 演示
我目前正在 C++ 中使用 elfutils 库,我正在努力解决一些应该显而易见的事情。 这是显示我的问题的 MCVE: 文件.cpp 结构Elf64_Sym; #包括 我目前正在使用 C++ 的 elfutils 库进行工作,我正在努力解决一些应该显而易见的事情。 这是一个 MCVE 显示了我的问题: 文件.cpp struct Elf64_Sym; #include <elf.h> 当然,在完整的代码中,前向声明是在 .hpp 文件中完成的,而 <elf.h> 包含是在 .cpp 文件中完成的,但这个小示例重现了完全相同的问题。您可以尝试使用以下命令行来编译它g++ file.cpp,您将收到以下错误: In file included from /usr/include/libelf.h:36, from file.cpp:3: /usr/include/elf.h:538:3: error: conflicting declaration 'typedef struct Elf64_Sym Elf64_Sym' 538 | } Elf64_Sym; | ^~~~~~~~~ file.cpp:1:8: note: previous declaration as 'struct Elf64_Sym' 1 | struct Elf64_Sym; | ^~~~~~~~~ 使用 gcc 可以很好地编译(在 C 中也是如此),但在 g++ 中则不行(在 C++ 中也是如此)。 您是否有允许在 C++ 中向前声明 Elf64_Sym 结构的解决方案? 为了完整起见,这里是 <elf.h> 中该结构的定义: typedef struct { Elf64_Word st_name; /* Symbol name (string tbl index) */ unsigned char st_info; /* Symbol type and binding */ unsigned char st_other; /* Symbol visibility */ Elf64_Section st_shndx; /* Section index */ Elf64_Addr st_value; /* Symbol value */ Elf64_Xword st_size; /* Symbol size */ } Elf64_Sym; 您是否有允许在 C++ 中前向声明 Elf64_Sym 结构的解决方案? 您根本不需要在源文件中写入 struct Elf64_Sym,因为您已经包含了具有所需 typedef 的标头。 您可以直接创建Elf64_Sym类型的对象,方法是: Elf64_Sym object; 在源文件中。 工作演示
前向声明函数允许不正确的返回类型:为什么这里没有链接器错误?
$ g++ --版本 配置为: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1 Apple clang 版本...
$ g++ --版本 配置为: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1 Apple clang 版本...
$ g++ --版本 配置为: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1 Apple clang 版本...
这个问题是关于嵌套类的C++声明规则。我正在寻找一种方法来转发声明以下内容(对于 gcc)或理解为什么它不可能。 标头:测试.h: CTe 类...
这个问题在本论坛已经争论过很多次了。然而,有一种情况我还没有找到解决的好方法。 from __future__ 导入注释 A类: 经过 班级
Python 避免在相互引用中从另一个类重新定义一个类时 mypy 失败
考虑一对在 Python 中表示相同事物的类,并且每个类都实现一个将一个类转换为另一个类的方法。作为一个例子,考虑从笛卡尔坐标转换为极坐标......
我有一堂这样的课... 类容器{ 民众: 类迭代器 { ... }; ... }; 在其他地方,我想通过引用传递 Container::Iterator,但我不想包含
给定一个如下所示的模板类: 模板 类映射 { 民众: ... Type valueFor(const IDType& id) { // 返回...