我知道C++标准明确保证了大小char,signed char和unsigned char.此外,它提供了保证,比方说,short至少是一样大的char,int大如short等,但有关的,比如说绝对值没有明确的保证,sizeof(int).这是我头脑中的信息,我和它幸福地生活在一起.然而,不久之前,我在SO中找到了一条评论(找不到它),在C long中保证至少有4个字节,而且这个要求是由C++"继承"的.是这样的吗?如果是这样,我们对C++中算术类型的大小有什么其他的隐含保证?请注意,我对这个问题中不同平台的实际保证完全不感兴趣,只是理论上的 那些.
考虑这个翻译单位:
#include <map>
#include <string>
int main()
{
std::map<std::string, std::size_t> mp;
mp.insert(std::make_pair("hello", 42));
}
Run Code Online (Sandbox Code Playgroud)
这个翻译单元有两件事困扰着我,他们是
我刚才假设<cstddef>和<utility>必须已#include被D <string>和<map>.
这个假设有多合适?至少make_pair我认为有一个非常强大的保证,因为地图成员接口使用std::pair.因为std::size_t没有正式的保证,但是一旦你包括map或者,它很可能是可用的string.第一个风格问题是,您是否明确包含<cstddef>并<utility>在此翻译单元中?
这部分部分处理了已经包含的一些标题的不确定性.但是,问题的第二部分.假设我们有这个
//f.h
#ifndef BIG_F_GUARD
#define BIG_F_GUARD
#include <string>
std::string f();
#endif
//f.cpp
#include "f.h"
std::string f()
{
std::string s;
return s;
}
Run Code Online (Sandbox Code Playgroud)
第二个问题是:你明确#include <string>到f.cpp吗?
我想我的问题很明确.顺便说一句.这两个问题后面都是一个很大的WHY:)谢谢.
我很长一段时间以来的理解是,在预处理器运行之后,C++转换单元是一系列声明(让我提醒任何定义也是一个声明).
很多人都赞同这个说法,但没有人给出反例.但我自己发现这个让我烦恼的例子:
int x; //declaration
; // ??? EMPTY DECLARATION?
int main() //dec
{ //la
} //ration
Run Code Online (Sandbox Code Playgroud)
这与MSVC和在线照片很好地编辑.我知道标准定义了一个空语句,但我从未听说过空声明.所以,我看到三个选择:
请帮我解除疑惑.谢谢
当我们使用任务管理器结束进程命令在Windows中终止进程时,进程是否仍会返回退出代码?如果是这样,它返回什么退出代码?谢谢
在x86处理器下,我不确定比较和交换原子操作和加载链接/存储条件操作之间的区别.后者比前者更安全吗?情况是第一个比第二个好吗?
我很难理解glPolygonOffset函数中第一个参数的含义.
void glPolygonOffset(GLfloat factor, GLfloat units);
Run Code Online (Sandbox Code Playgroud)
官方文件说明了这个因素
指定用于为每个多边形创建变量深度偏移的比例因子.
然后
在从适当顶点的深度值插值后,每个片段的深度值将被偏移.偏移的值是因子×DZ + r×单位,其中DZ是相对于多边形的屏幕区域的深度变化的度量,并且r是保证给定给定的可解析偏移的最小值实现.
我明白了什么r和unit是.我不明白的是什么DZ,即"测量多边形屏幕区域的深度值变化"是什么意思,为什么我需要将因子设置为0以外的任何值.
如果我想让我的线框偏移,我只需要在深度值上添加/减少几个单位,不是吗?factor参数(以及文档中提到的DZ)的含义,用途和用法示例是什么?
end()返回一个过去的迭代器的副本,对吗?list.end()是一个右值,对吧?怎么会这样呢
std::list<int> lst;
// ...
--l.end();`
Run Code Online (Sandbox Code Playgroud)
编译?
正确指出,我的第三点不一定正确.但那么这个代码又如何编译呢?
struct A{};
void f(A&)
{
}
A a()
{
return A();
}
int main()
{
f(a());
}
Run Code Online (Sandbox Code Playgroud) 如果在类中定义了成员函数,则它是内联函数.例如
struct X
{
void mem_f() {} //mem_f is inline
};
Run Code Online (Sandbox Code Playgroud)
我的问题是在类中定义的非成员友元函数是否也是自动内联的.
例如
struct Y
{
friend void friend_f() {} //is friend_f inline?
};
Run Code Online (Sandbox Code Playgroud)
标准中的相关引用/ paragraph_no将非常受欢迎.谢谢.
我正在读这篇文章,这里有一个代码示例:
struct X {
static bool f( int* p )
{
return p && 0[p] and not p[1:>>p[2];
};
};
Run Code Online (Sandbox Code Playgroud)
问题是:兼容编译器应该提供多少错误:
我回答了一个,因为这段代码相当于
struct X {
static bool f( int* p )
{
return p && p[0] && ! p[1] > p[2];
};
};
Run Code Online (Sandbox Code Playgroud)
而且我认为静态函数定义之后的分号将是一个错误.但萨特先生说0并解释(除了我所理解的事情)
函数声明结束时允许使用"额外"分号.
我的问题是:
分号是否可以出现在两个成员之间或类定义中的任何其他位置,如
struct X
{
int a;;;;int b; //Legal?
};
Run Code Online (Sandbox Code Playgroud)假设我有一个数组:
char[] chars={'X','X','m','a','t','t','X','X'};
Run Code Online (Sandbox Code Playgroud)
我想创建值为"matt"的String,所以从字符索引2到5开始.是否有内置方法来实现这一点,或者我必须进行循环?