前向声明允许静态类型的程序指示符号的类型和名称,而不实际定义它。
假设有一个源文件un2.cpp ----un2.cpp---- 班级员工; void 员工::setname(字符串 s) { ......(一些代码) } 员工类在 un2.h 中定义,其中 setname() 是声明...
我有一个名为A的类,它有.cpp和.hpp文件。这取决于B类和C类。现在,我想知道,我应该在A.cpp还是A.hpp中#include B.hpp和#include C.hpp?我认为这会有好处...
嗯,我有以下问题..我有main.cpp #include“serverClass.h” ... 然后在serverClass.h中, #ifndef SERVERCLASS_H_ #定义SERVERCLASS_H_ #包括 #包括 嗯,我有以下问题..我有main.cpp #include "serverClass.h" ... 然后在serverClass.h中, #ifndef SERVERCLASS_H_ #define SERVERCLASS_H_ #include <stdio.h> #include <stdlib.h> #include "clientThread.h" .... 在 clientThread 中, class ClientThread { private: serverClass* server; .... 但是当它尝试编译 ClientThread 时,它说 serverClass 不是类型,因为它尚未编译。我无法避免将 clientThread.h 包含在 serverClass 中。有没有办法告诉编译器有一个名为 serverClass 的类型尚未编译? 您需要转发delcare serverClass: class serverClass; class ClientThread { private: serverClass* server; .... 在clientThread.h中,在ClientThread类定义之前,您可以前向声明ServerClass类: // Forward declaration class ServerClass; class ClientThread { private: ServerClass* server; ....
为什么结构的前向声明在我的代码中不起作用?什么时候可以在C中使用?
前向声明,无论是结构体还是函数,不是应该做前向声明所期望的事情吗,即让我们在定义结构或函数之前使用它们?为什么我...
在前向声明中“使用 typedef-name ... 作为类”
我在这里做一些基于策略的设计,我需要输入大量模板类型来缩短名称。 现在的问题来了,当我需要使用指向其中一种类型的指针时,我......
我以为我很了解 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 版本...