问题标签 [language-lawyer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C 程序需要 main() 吗?
好吧,标题说明了一切。main()
函数对于 C 程序来说是绝对必要的吗?
我问这个是因为我正在查看 Linux 内核代码,但我没有看到 main() 函数。
c++ - 具有与另一个类同名的类静态方法
这是示例:
编译器错误是:
我在 Fedora 9 上使用 gcc 4.3.0。
有人可以解释为什么编译器会抱怨吗?如果可能,请参考标准中的参考资料。
谢谢
c++ - 如果它不是纯的,则使用虚拟成员函数?
C++03 3.2.2
...如果对象或非重载函数的名称出现在可能求值的表达式中,则使用该对象或非重载函数。如果它不是纯的,则使用虚拟成员函数...
然后在后面3.2.3
我们有:每个程序都应该包含该程序中使用的每个非内联函数或对象的一个定义;无需诊断。定义可以显式出现在程序中,可以在标准或用户定义库中找到,或者(在适当时)隐式定义(参见 12.1、12.4 和 12.8)。内联函数应在使用它的每个翻译单元中定义。
按照我正在阅读的内容:不使用纯虚函数。ODR 仅适用于使用的功能。这是否意味着以下内容是合法的?我猜答案是否定的,它没有,但我不明白为什么。
c++ - 纯虚函数可能没有内联定义。为什么?
纯虚函数是那些具有纯说明符( = 0;
)的虚成员函数
C++03 的第 10.4 条第 2 段告诉我们什么是抽象类,作为旁注,如下:
[注意:函数声明不能同时提供纯说明符和定义——尾注] [示例:
——结束示例]
对于那些不太熟悉这个问题的人,请注意纯虚函数可以有定义,但上述条款禁止此类定义出现内联(词法类内)。(对于定义纯虚函数的用途,您可能会看到,例如,这个 GotW)
现在对于所有其他种类和类型的函数,它可以提供一个类内定义,而且这个限制乍一看似乎是绝对人为的和莫名其妙的。想想看,第二眼和随后的一瞥似乎都是这样 :) 但我相信如果没有具体原因,限制就不会存在。
我的问题是:有人知道这些具体原因吗?也欢迎好的猜测。
笔记:
- MSVC 确实允许 PVF 具有内联定义。所以不要惊讶:)
- 这个问题中的词
inline
不是指inline关键字。它应该是词汇上的意思
c - 这种对非原型函数声明的可疑使用是否有效?
这是有效的 C (C99) 代码吗?
g
显然,如果程序使用负参数调用并且f
不是带有单个int
参数的函数,或者如果g
使用非负参数调用并且f
不是带有两个参数的函数,则程序具有未定义的行为int
。然而在其他方面?
以这个单独的源文件为例,它g
从上面调用并提供f
:
c++ - 定义具有不同签名的函数
今天我发现可以在具有一个签名的头文件中声明一个函数,并在具有不同(相似)签名的源文件中实现它。例如,像这样:
这是允许的吗?或者这是编译器的扩展(我使用的是 g++ 4.3.0)?
编辑 我正在以迂腐和最大可能的警告级别进行编译,但我仍然没有收到警告或错误。
c++ - std::map 的类型要求
今天我创建了一个映射,其中值类型没有默认构造函数。我很惊讶我无法使用 operator[] 将元素插入此地图,但我不得不使用 insert 方法。
那么,对于 std::map 的键和值类型到底有什么要求呢?
这是一个简短的例子:
我是这样编译的:
c++ - 引用基类时是否需要命名空间
我有这样的代码:
我是否需要 Derived 引用它的基类的命名空间限定符?GCC 和 MSVC 对编写的代码很满意,但是除非我将命名空间放入,否则另一个编译器会抱怨。C++ 标准是怎么说的?
c++ - C++ 标准究竟在哪里说取消引用未初始化的指针是未定义的行为?
到目前为止,我找不到如何推断以下内容:
是未定义的行为。
首先,有 5.3.1/1 声明这*
意味着间接转换T*
为T
. 但这并没有说明UB。
然后经常引用 3.7.3.2/4 说,在非空指针上使用释放函数会使指针无效,然后无效指针的使用是 UB。但在上面的代码中,没有关于释放的内容。
上面的代码中如何推导出UB?