ISO C委员会(ISO/IEC JTC1/SC21/WG14)已发布TR 24731-1,正在研究TR 24731-2:
TR 24731-1:C库的扩展第一部分:边界检查接口
WG14正在研究更安全的C库函数.该TR旨在通过添加具有缓冲区长度的额外参数来修改现有程序.最新草案见N1225号文件.理由是在N1173号文件中.这将成为技术报告类型2.
TR 24731-2:C库的扩展 - 第二部分:动态分配功能
WG14正在研究更安全的C库函数.该TR面向使用动态分配而不是缓冲区长度的额外参数的新程序.最新草案见N1337号文件.这将成为技术报告类型2.
我正在尝试为大型框架实现回溯功能,该框架用于不同的平台和操作系统.在其中一些中,它与glibc相关联,而在另一个中,使用了不同的东西(例如uclibc).backtrace()函数仅存在于前者中.
有没有办法判断glibc是否被使用?任何#define?我无法在glibc手册中找到答案.我知道在编译期间我不能有链接时间信息,但我想包含文件必须有所不同.至少必须在某处声明回溯.我想检查它而不必强制将显式标志传递给编译器.
我最近发现在C++中你可以以一种奇怪的方式重载"函数调用"操作符,你需要编写两对括号来执行此操作:
class A {
int n;
public:
void operator ()() const;
};
Run Code Online (Sandbox Code Playgroud)
然后以这种方式使用它:
A a;
a();
Run Code Online (Sandbox Code Playgroud)
什么时候有用?
我在这里有一小段代码供您考虑,这让我感到非常困惑.奇怪的是,它在Sun Studio和GCC上编译,即使我认为它不应该.
考虑一下:
namespace name
{
class C
{
int a;
};
void f(C c);
void g(int a);
}
int main(int argc, char** argv)
{
name::C c;
name::f(c);
f(c); // <--- this compiles, strangely enough
name::g(42);
// g(42); <--- this does not, as I expected
}
Run Code Online (Sandbox Code Playgroud)
来自同一命名空间的类参数会导致函数f
"泄漏"到命名空间之外,并且无需访问name::
.
有人对此有解释吗?这当然是我而不是编译器在这里错了.
我一直在看C++标准库和C++标准模板库(STL).他们之间有什么区别?维基百科提到他们共享一些标题,但这就是它.
为什么要std::swap
转移到<utility>
C++ 11 的标题?
N3290 C.2.7说:
17.6.3.2
对原始功能的影响:功能交换移动到不同的标头
基本原理:删除对
<algorithm>
swap的依赖.对原始功能的影响:已编译的有效C++ 2003代码期望交换
<algorithm>
可能必须包含<utility>
.
我无法理解这部分的粗体.正在讨论什么样的依赖关系?为什么?
等于运算符对指针的关系运算符有语义限制:
==(等于)和!=(不等于)运算符具有与关系运算符相同的语义限制,转换和结果类型,除了它们的优先级和真值结果.[C++03§5.10p2]
关系运算符对比较指针有限制:
如果同一类型的两个指针p和q指向不是同一个对象的成员或同一个数组的元素或不同函数的不同对象,或者只有其中一个为null,则p <q,p的结果> q,p <= q,p> = q未指定.[§5.9p2]
这是一个由等式运算符"继承"的语义限制吗?
具体来说,给出:
int a[42];
int b[42];
Run Code Online (Sandbox Code Playgroud)
很明显,(a + 3)<(b + 3)是未指定的,但是(a + 3)==(b + 3)也未指定?
我已经在Firefox中使用Vimperator很长一段时间了.我想隐藏或删除地址栏以获得更大的主窗口.但是,在更新到v29.0之后,无法隐藏或删除地址栏.我怎样才能做到这一点?或者哪个加载项可以帮助?
这是我旧版本的屏幕截图(在v29.0之前); 你可以看到地址栏已被隐藏:
(答案提示.)
鉴于N3290,§7.1.6.2p4,其中列表项目未编号,但为了方便我们编号:
decltype(e)表示的类型定义如下:
- 如果e是未表示的id-expression或未加密的类成员访问(5.2.5),则decltype(e)是e所命名的实体的类型.如果没有这样的实体,或者如果e命名了一组重载函数,那么该程序就会形成错误;
- 否则,如果e是x值,则decltype(e)是T &&,其中T是e的类型;
- 否则,如果e是左值,则decltype(e)是T&,其中T是e的类型;
- 否则,decltype(e)是e的类型.
decltype(0 + 0)指定的类型是什么?
第1项不适用,2可能,但如果没有,则3不适用,4将是结果.那么,什么是xvalue,是0 + 0和xvalue?
§3.10p1:
xvalue("eXpiring"值)也指对象,通常接近其生命周期的末尾(例如,可以移动其资源).xvalue是涉及rvalue引用的某些表达式的结果(8.3.2).
我在§8.3.2中没有看到任何有用的内容,但我知道"0 + 0"不涉及任何右值引用.文字0是一个prvalue,它是"一个不是xvalue的rvalue"(§3.10p1).我相信"0 + 0"也是一个prvalue.如果这是真的,"decltype(0 + 0)"将是int(不是int &&).
我的解释错过了什么吗?这段代码是否格式良好?
decltype(0 + 0) x; // Not initialized.
Run Code Online (Sandbox Code Playgroud)
该代码编译在GCC 4.7.0 20110427和Clang 2.9(主干126116)上.例如,如果decltype指定了int &&类型,那么它将不会格式良好.
# include <iostream>
using namespace std;
class A
{
public:
virtual void f()
{
cout << "A::f()" << endl;
}
};
class B:public A
{
private:
virtual void f()
{
cout << "B::f()" << endl;
}
};
int main()
{
A *ptr = new B;
ptr->f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码正常工作并打印B :: f().我知道它是如何工作的,但为什么允许这个代码呢?