停止和进一步执行原生程序的功能在技术上是如何实现的?查看堆栈、寄存器和内存是如何实现的?
当然,在口译员的情况下。可以命令它“停止”、“显示堆栈”,因为解释器是一个具有自己接口的独立程序。但是使用本地调试,会发生某种神奇的事情,程序和调试器在同一个处理器上工作,但调试器控制另一个程序并看到它的所有内容。这个魔法是如何工作的?
停止和进一步执行原生程序的功能在技术上是如何实现的?查看堆栈、寄存器和内存是如何实现的?
当然,在口译员的情况下。可以命令它“停止”、“显示堆栈”,因为解释器是一个具有自己接口的独立程序。但是使用本地调试,会发生某种神奇的事情,程序和调试器在同一个处理器上工作,但调试器控制另一个程序并看到它的所有内容。这个魔法是如何工作的?
保存命令!有这样一个批处理文件:
echo OFF
SetLocal EnableDelayedExpansion
echo %1
echo -
set "tailA="
for %%A in (%*) do (
if %tailA% EQU 1 echo %%A
set tailA=1
)
任务是绕过传递给脚本的所有参数,除了第一个参数,并为每个参数执行某个命令,这里举个例子,只是 echo。因此,在启动时会出现错误:
意外出现:1。
该项目有一系列模板函数,它们接受带有一些预期接口的参数。或多或少是这样的:
template<typename T>
void do_some(...)
{
//...
const auto c = T::some();
//...
}
template<typename T>
void do_other(...)
{
//...
const auto o = T::other();
//...
}
所以,有些特化需要T::other()
在这个地方禁止调用并显示编译错误。
第一个解决方案是简单地不声明other
所需的 specialization T
,但是编译器会抛出一个关于缺席的错误,other
并且不清楚该怎么做。我想展示一些可以理解的东西,以便清楚地表明禁止other
这样T
做,而不是忘记它。
第二种解决方案是使用static_assert
,如下所示:
int Spec::other()
{
static_assert(false, "you must not call `other` func");
}
但是,当编译器遇到定义时,总是会抛出错误Spec::other
,而不是在调用它的地方do_other
。需要时如何显示错误?
命令是这样的:
copy /b 7zS2.sfx + config.txt + boundle.7z dounble.exe
该文件7zS2.sfx
位于 %PATH% 中的一个文件夹中,并且copy
由于找不到该文件,因此未执行该命令。怎么做?
是否可以声明noexcept
一个从引用接收指针的函数。例如,这个函数:
template<typename T>
const void * void_pointer(const T & object) noexcept
{
return &object;
}
需要在单独的进程中运行控制台实用程序,CreateProcess
以便控制台窗口不会关闭。为此,我使用类似这样的命令行:
cmd /K "util arg1 "arg2" arg3="value""
同时,嵌套命令有大量以复杂方式指定的参数,但主要是那里使用了嵌套引号。问题是如何屏蔽它们?
有一个指向成员的指针,你需要得到这个地址的一个数字表示,也就是一个偏移量。在这样的代码中:
struct Foo
{
int Bar;
};
auto pointer_to_member = &Foo::Bar;
auto offset_of_member = reinterpret_cast<uintptr_t>(pointer_to_member); // ошибка
我的 VisualC++ 写了一个错误:
错误 C2440:
reinterpret_cast
无法转换int Foo::Bar *
为uintptr_t
问题。这不是标准吗?以及如何在没有offsetof
指向成员的现成指针的情况下获得偏移量?
委婉地说,未定义的行为是语言设计中的一个模棱两可的决定。然而,数以百万计的程序员不得不忍受这种邪恶。在标准中,出现未定义行为的情况是用非常繁重的技术语言描述的。毫不奇怪,大量的程序员,以及他们中的大部分人,根本没有阅读标准,如果他们阅读了,他们一半看不懂,而忘记了另一半。
最糟糕的不是标准通常允许未定义的行为,或者它相当普遍。事实上,在生活中,普通程序员根本无法理解。更令人失望的是编译器开发人员不寻求帮助他们的客户,一个普通的程序员,尽管他们可以,一个教科书的例子:
int i = 0;
i = ++i + i++;
在这里,我的 MSVC 默默地吃这段代码。在很多情况下编译器会警告程序员。