定义和声明有什么区别?

2023-11-23

我不明白两者的含义。


A 宣言引入标识符并描述其类型,无论是类型、对象还是函数。声明是编译器需要什么接受对该标识符的引用。这些是声明:

extern int bar;
extern int g(int, int);
double f(int, double); // extern can be omitted for function declarations
class foo; // no extern allowed for type declarations

A 定义实际上实例化/实现了这个标识符。它是链接器需要什么以便将引用链接到这些实体。这些是与上述声明相对应的定义:

int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
class foo {};

可以使用定义来代替声明。

标识符可以是declared只要你愿意就可以。因此,以下内容在 C 和 C++ 中是合法的:

double f(int, double);
double f(int, double);
extern double f(int, double); // the same as the two above
extern double f(int, double);

然而,它必须是defined正好一次。如果您忘记定义已在某处声明和引用的内容,则链接器不知道将引用链接到什么,并抱怨缺少符号。如果您多次定义某个内容,则链接器不知道which链接引用的定义并抱怨重复的符号。


自从争论什么是类宣言与一个类定义在 C++ 中不断出现(在其他问题的答案和评论中),我将在此处粘贴 C++ 标准的引用。
在 3.1/2 时,C++03 说:

声明就是定义,除非它[...]是类名声明[...]。

3.1/3 然后给出了一些例子。其中:



[Example: [...]
struct S { int a; int b; }; // defines S, S::a, and S::b [...]
struct S; // declares S
—end example
  

总结一下:C++ 标准考虑struct x;成为一个宣言 and struct x {}; a 定义。 (换句话说,“前瞻性声明”用词不当,因为 C++ 中没有其他形式的类声明。)

谢谢约翰内斯·绍布 (Johannes Schaub)谁在他的一个答案中挖出了实际的章节和诗句。

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

定义和声明有什么区别? 的相关文章

  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 我如何理解这个 C 类型声明?

    double bar int double double double double 在查看讲座幻灯片时 我发现了留给学生的练习 用简单的英语来说 什么是类型bar在这个 C 声明中 Please帮助我解决这个问题 我什至不知道从哪里开始
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行

随机推荐

  • 在 NSString 中包含一个变量?

    这很好用 我们都知道 NSString textoutput Hello outLabel text textoutput 但是 如果你想在其中包含一个变量怎么办 NSString声明如下 NSString textoutput Hello
  • JPA - 从计算列设置实体类属性?

    我刚刚在 Glassfish 3 上运行的简单 Java Web 应用程序中掌握 JPA 持久性提供程序是 EclipseLink 到目前为止 我真的很喜欢它 除了 netbeans glassfish 交互中的错误 但有件事我希望能够做到
  • 将数据插入 Oracle 表的最快方法是什么?

    我正在 PL SQL 中编写数据转换 用于处理数据并将其加载到表中 根据 PL SQL Profiler 转换中最慢的部分之一是实际插入到目标表中 该表有一个索引 为了准备加载数据 我使用表的行类型填充一个变量 然后将其插入表中 如下所示
  • 设置吐司的背景颜色使其成为矩形

    如果我设置我的背景颜色Toast with t getView setBackgroundColor ctx getResources getColor R color myorange 新的 Android 4 4 圆形Toast变成了矩
  • 事件和函数之间的区别?

    我是 Node 新手 我正在努力理解事件和函数之间的主要区别 两者都需要触发 那么如果我们无论如何都必须触发事件 为什么我们还需要事件呢 它与触发函数有何不同 示例代码 var events require events var event
  • 在小键盘视图打开的情况下启动 TabTip

    我基本上有启动键盘的代码 但它以字母数字部分打开 用于编辑的框是带有数字的 NumericUpDown 因此 我想打开 tabtip exe 又名 Windows 8 1 中的屏幕键盘 并聚焦于数字键盘 这是我当前打开 tabtip 的代码
  • 使用模板类时链接器错误? [复制]

    这个问题在这里已经有答案了 I m getting an unresolved external symbol public thiscall hijo
  • 对档案中的随机访问提供良好支持的压缩格式? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 这类似于一个上一个问题 但那里的答案不能满足我的需求 我的问题略有不同 我目前对一些包含排序数据的非常大的文件使用 gzip 压缩 当文件未压缩时
  • 为什么我收到 AttributeError: 'KerasClassifier' 对象没有属性 'model'?

    这是代码 我只在最后一行收到错误y pred classifier predict X test 我收到的错误是AttributeError KerasClassifier object has no attribute model Imp
  • php中的二维多维数组到一维数组[重复]

    这个问题在这里已经有答案了 只是想知道是否有人在 php 中将 2 维数组转换为 1 维数组 我还没有在 php ini 中找到明确的解释 任何建议将不胜感激 如果您从查询中获取值 这可能对您有帮助 您可以使用 PHP 5 5 支持的数组函
  • 嵌套类模板的重载运算符<<

    我有以下设置 template lt class T gt struct Foo struct Bar Bar const T t otherT t T otherT Foo const T t myT t T myT 现在 我想举例说明F
  • 使用 ADAL.js 获取的令牌对 Azure 移动服务应用程序进行身份验证

    我正在尝试针对 Azure 移动服务应用程序对 HTML 应用程序进行身份验证 设置 两个应用程序都使用 AAD 作为身份验证后端 因此两个应用程序都有一个在 Active Directory 中注册的应用程序 Azure 移动服务应用程序
  • 使用 SBT 复制文件

    我正在使用 SBT 构建 java 项目 并且需要复制文本文件 不是资源 而是由 java 类用来读取 我对 SBT 或 Scala 都没有经验 build scala 文件需要 任何帮助将非常感激 例如 如果我的目录结构是 test fi
  • 如何检查消息(postMessage)来自哪个跨域 iframe?

    我知道MessageEvent has source属性是发送消息的窗口对象 现在如何让这些信息检查主文档中的哪个 iframe 当然还有消息到达时的主文档中 是该特定消息的来源 是唯一可用的选项来检查location href on th
  • android 是否重用从资源加载的图像?

    因此 我在一个 Activity 中有多个 ImageView 并且它们都使用资源中的相同图像位图 ImageViewOne setImageResource R drawable frequently used image ImageVi
  • std::tuple 的重载运算符 << - 可能的简化?

    I used SO问题 迭代元组 的答案编写一个方法来重载 lt lt 此方法经过测试 似乎可以正确使用g 4 7在 Debian 挤压上 然而这种方法有点迂回 因为它看起来 lt lt 无法显式实例化 我找到了一篇关于它的帖子here 因
  • 获取所选 primefaces 数据表行的行号

    我有一个 primefaces 数据表 需要在 JSF 页面中显示 总行数 的 所选行号 我可以使用 rowIndexVar 属性在其中一列中显示行号 但我不知道要显示在行选择的输入文本中分别使用相同的数字 我应该在 JSF 页面或托管 b
  • from utils import label_map_util 导入错误:没有名为 utils 的模块

    我正在尝试运行object detection ipynb输入program 但它是一个普通的python程序 py 它工作得很好 但是当在内部运行时 models research object detection文件夹 但主要问题是当我
  • 如何修复由于 libmysqlclient.15.dylib 未加载而导致的错误?

    我已经升级到 Rails 2 2 2 并安装了 MySQL 2 7 gem 当我尝试运行迁移或启动服务器时看到此错误 dlopen Library Ruby Gems 1 8 gems mysql 2 7 lib mysql bundle
  • 定义和声明有什么区别?

    我不明白两者的含义 A 宣言引入标识符并描述其类型 无论是类型 对象还是函数 声明是编译器需要什么接受对该标识符的引用 这些是声明 extern int bar extern int g int int double f int doubl