我已经看到并使用了如下的C++代码:
int myFourcc = 'ABCD';
Run Code Online (Sandbox Code Playgroud)
它适用于最近的GCC版本,不知道最近的版本.这个功能是否在标准中?这叫什么?
我在网上搜索时遇到了麻烦......
编辑:
对于未来的观察者,我也发现了这些信息:
来自gcc文档
编译器一次为一个字符定义一个多字符字符常量,将前一个值左移每个目标字符的位数,然后在截断到目标宽度的新字符的位模式中输入字符.最终的位模式为int类型,因此无论单个字符是否有符号都是有符号的(与版本3.1及更早版本的GCC略有不同).如果常量中的字符数多于目标int中的字符数,则编译器会发出警告,并忽略多余的前导字符.
例如,具有8位字符的目标的'ab'将被解释为
(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')', and '\234a' as(int)((unsigned char)'\ 234'*256 +(unsigned char)'a')'.
有一些像这样的代码:
// Convenience to make things more legible in the following code
const float & x = some.buried.variable.elsewhere;
// Go on to use x in calculations...
Run Code Online (Sandbox Code Playgroud)
我被告知"const float&"是"坏",应该只是一个普通的浮点数或常量浮点数.
然而,除了"你不必输入'和'"之外,我无法想到一个令人信服的理由.
事实上,在我看来,在某些情况下原始可能更好,因为编译器可能不会为变量分配额外的堆栈空间.
换句话说,最初我可以有效地说:
assert(&x == &some.buried.variable.elsewhere)
Run Code Online (Sandbox Code Playgroud)
而在第二种情况下我不能.
此外,在我看来,原始似乎更好地传达意图,因为引用的整个要点是为另一个值创建别名.
任何人都可以举例说明"const float&"版本在某种有形方面比普通的"浮动"或"常量浮动"更糟糕吗?
我最初写了一些像这样的代码:
class Foo
{
public:
Foo() : m_buffer()
{}
private:
char m_buffer[1024];
};
Run Code Online (Sandbox Code Playgroud)
比我更聪明的人说使用m_buffer()初始化程序会将内存清零.我的意图是保持记忆不被初始化.我没有时间进一步讨论它,但它激起了我的好奇心.
以前,我曾认为总是在初始化列表中列出每个成员是明智的.
有人可以进一步描述这种行为吗?
1)为什么empty-paren初始化程序会填充内存?
2)它只适用于POD数据类型吗?我听说是这样,但没有标准的方便.
谢谢
我有一个简单的生产者/消费者场景,其中只有一个项目被生产/消费.此外,生产者在继续之前等待工作线程完成.我意识到这种情况可以避免多线程的全部问题,但请假设它真的需要这样(:
这段代码不能编译,但我希望你能得到这个想法:
// m_data is initially null
// This could be called by any number of producer threads simultaneously
void SetData(object foo)
{
lock(x) // Line A
{
assert(m_data == null);
m_data = foo;
Monitor.Pulse(x) // Line B
while(m_data != null)
Monitor.Wait(x) // Line C
}
}
// This is only ever called by a single worker thread
void UseData()
{
lock(x) // Line D
{
while(m_data == null)
Monitor.Wait(x) // Line E
// here, do something with m_data
m_data …Run Code Online (Sandbox Code Playgroud)