为什么下面的代码会编译?
#ifdef C++11
// ...
#endif
int main() {}
Run Code Online (Sandbox Code Playgroud)
gcc 4.8.0 给了我以下警告:
#ifdef 指令末尾的额外标记
根据标准,宏名称只能包含字母、数字和下划线字符。
也许是因为这个?
ISO/IEC 14882:2011
16.1 条件包含 [cpp.cond]
6 按顺序检查每个指令的条件。如果它评估为假(零),则跳过它控制的组:指令仅通过确定指令的名称进行处理,以跟踪嵌套条件的级别;指令的其余预处理标记将被忽略,组中的其他预处理标记也将被忽略。仅处理其控制条件评估为真(非零)的第一组。如果所有条件的计算结果都不为真,并且存在 #else 指令,则处理由 #else 控制的组;缺少#else 指令,直到#endif 的所有组都被跳过。151
我无法正确理解这句话。
我可以像下面的代码一样使用smth:
int main()
{
int* foo = new int;
double* bar = reinterpret_cast<double*>(foo);
delete bar;
}
Run Code Online (Sandbox Code Playgroud)
是UB吗?
我认为我们只需要为operator new返回的指针调用operator delete,但是在这种情况下怎么样?
我认为它是UB,因为reinterpret_cast不会对结果指针提供任何保证.我对吗?
有人可以从标准中发布正确的报价吗?
在Visual Studio 2013中如何支持Windows XP和Windows Server 2003?我可以在Visual Studio 2013中为这些系统用C++编写程序吗?
假设我有以下代码:
#include <boost/chrono.hpp>
#include <boost/thread.hpp>
#include <iostream>
int main()
{
boost::thread thd([]{ std::cout << "str \n"; });
boost::this_thread::sleep_for(boost::chrono::seconds(3));
if (thd.try_join_for(boost::chrono::nanoseconds(1)))
{
std::cout << "Finished \n";
}
else
{
std::cout << "Running \n";
}
}
Run Code Online (Sandbox Code Playgroud)
每次启动该程序时,MSVC-12.0和boost 1.55都会为我提供不同的输出。例如,
str
Finished
str
Finished
str
Running
Run Code Online (Sandbox Code Playgroud)
当我将boost :: chrono :: nanoseconds更改为boost :: chrono :: microseconds时,输出看起来像预期的那样。
为什么?我究竟做错了什么?这是Boost库中的错误吗?Boost Bug Tracker中是否有入场券?
提前致谢。
为什么第一个代码不起作用,而第二个代码呢?
第一个代码:
import selenium
driver = selenium.webdriver.Firefox()
Run Code Online (Sandbox Code Playgroud)
AttributeError:'module'对象没有属性'webdriver'
第二个代码:
from selenium import webdriver
driver = webdriver.Firefox()
Run Code Online (Sandbox Code Playgroud) 我知道这段代码在C和C++中都是有效的:
#define FOO 0
#define FOO 0
Run Code Online (Sandbox Code Playgroud)
ISO/IEC 14882:2011
16.3宏替换[cpp.replace]
2当前定义为类似对象的宏的标识符可以由另一个#define预处理指令重新定义,前提是第二个定义是类似于对象的宏定义,并且两个替换列表相同,否则程序格式不正确.同样,当前定义为类似函数的宏的标识符可以由另一个#define预处理指令重新定义,前提是第二个定义是具有相同数量和参数拼写的类函数宏定义,并且两个替换列表相同,否则该计划是不正确的.
但是这段代码怎么样?
#define FOO 0
#define FOO FOO
Run Code Online (Sandbox Code Playgroud)
替换列表在预处理开始时不相同(仅在第一次替换发生时).
使用std::ios_base::trunc标志的目的是什么std::ios_base::out?我在很多例子中都看过这个.
我认为标准std::ios_base::out也保证了截断文件(以及我知道的所有STL实现).我错了,应该明确通知我要截断文件?
是否有Finalizer比这更通用的方法来编写一个类?
#include <functional>
#include <iostream>
template <typename T>
class Finalizer
{
public:
Finalizer(const std::function<T>& f) : _f(f) {}
~Finalizer()
{
_f();
}
private:
std::function<T> _f;
};
int main()
{
Finalizer<void()> finalizer([]() { std::cout << "str" << std::endl; });
}
Run Code Online (Sandbox Code Playgroud)
我想摆脱手动类模板参数规范,以便能够编写如下代码:
Finalizer finalizer([]() { std::cout << "str" << std::endl; });
Run Code Online (Sandbox Code Playgroud)
可能吗?
是否保证此代码
function runEmbeddedJSInPageEnvironment(code) {
var e = document.createElement('script');
e.type = 'text/javascript';
e.appendChild(document.createTextNode(code));
(document.head || document.documentElement).appendChild(e);
e.parentNode.removeChild(e);
}
runEmbeddedJSInPageEnvironment("$('#someform').off('submit');");
Run Code Online (Sandbox Code Playgroud)
将等待传递给的代码runEmbeddedJSInPageEnvironment先完成,然后通过调用removeChild函数将其从页面中删除?
或者可以在此代码执行完毕之前将其删除?
我需要在头文件和源文件中指定调用约定吗?
例如,
头文件.h
void __cdecl Foo();
Run Code Online (Sandbox Code Playgroud)
源代码.cpp
void __cdecl Foo()
{
}
Run Code Online (Sandbox Code Playgroud) c++ ×8
c ×2
boost ×1
boost-thread ×1
c++11 ×1
html ×1
javascript ×1
lambda ×1
python ×1
python-2.7 ×1
python-2.x ×1
visual-c++ ×1
windows ×1