在控制台应用程序中等待用户输入的最佳方法是什么?
std::cout << "press any key to exit...";
// wait for user to hit enter or another key
Run Code Online (Sandbox Code Playgroud) 我可以以某种方式使Visual C++ 2008拥有C++ 11库并使用C++ 11标准允许的所有好东西吗?
我的问题主要是专注于教授,并且是以"奇怪"的方式使用C++.在C++中,指向变量的指针和指向函数的指针之间没有太大区别.我们可以做一些像这样无用的事情:
char* buff = new char[32];
void (*func)() = (void (*)())buff;
Run Code Online (Sandbox Code Playgroud)
但我们几乎创造了一个从未存在的功能,对吗?如果我们进一步用文件中的x86命令stord填充buff怎么办?操作系统永远不会知道创建了一个函数.
#include <iostream>
using namespace std;
// no stack push'ing or pop'ing, nothing to return
void func(void){cout << "Hello?";}
int main()
{
char* x86_code = new char[6];
x86_code[0] = 0x9A; // call (far)
*((__int32*)(x86_code + 1)) = (__int32)func; // load 32-bit address
x86_code[5] = 0xC3; // ret
void (*x86_func)(void) = (void (*)(void))x86_code;
x86_func();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
调用x86_func()会产生运行时错误(违反读取位置0xFFFFFFFF).如果不是这样,操作系统如何在RAM中加载它的二进制文件或模块?非常感谢.
标准C++类型(如int或char)具有ctors,因此您可以使用以下表达式:
int a = int(67); // create anonymous variable and assing it to variable a
int b(13); // initialize variable b
int(77); // create anonymous variable
Run Code Online (Sandbox Code Playgroud)
用户定义的类型(结构或类)能够做同样的事情:
struct STRUCT
{
STRUCT(int a){}
};
STRUCT c = STRUCT(67);
STRUCT d(13);
STRUCT(77);
Run Code Online (Sandbox Code Playgroud)
问题是:为什么我们可以通过引用匿名结构或类实例传递,但不能传递标准类型?
struct STRUCT
{
STRUCT(int a){}
};
void func1(int& i){}
void func2(STRUCT& s){}
void func3(int i){}
void func4(STRUCT s){}
void main()
{
//func1(int(56)); // ERROR: C2664
func2(STRUCT(65)); // OK: anonymous object is created then assigned to a reference
func3(int(46)); // …Run Code Online (Sandbox Code Playgroud) 最近我找到了带有三个点参数的函数原型.我编写了自己的函数并编译得很好:
void func(int a, ...){}
Run Code Online (Sandbox Code Playgroud)
那是什么意思?
更新
感谢你们!我想到了.这是我的例子:
void func(unsigned int n_args, int arg, ...)
{
for(unsigned int i = 0; i < n_args; ++i)
cout << *((int*)&arg + i) << ' ';
}
Run Code Online (Sandbox Code Playgroud)
此函数打印出由空格字符分隔的参数.
在固定和相同长度之间std::vector<>和之间的分配,解除分配和访问时间是否有任何重大差异new[]?
如何操作foo = int可以由foo(int)(转换构造函数)和foo::operator=(int)(重载赋值运算符)完成?当一个人被召唤而不是其他人(也许一个是基本的)?
#include <iostream>
class foo
{
public:
foo(){}
foo(int r_value)
{
std::cout << "\nfoo::foo(int)\n";
}
void operator=(int r_value)
{
std::cout << "\nfoo::operator=(int)\n";
}
};
int main()
{
foo f;
f = 57;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码使得operator=(int)当同时存在来运行和foo(int)如果operator=(int)被注释(或相反).
c++ constructor operator-overloading assignment-operator operator-keyword
我已经读过,我不应该WM_PAINT手动发送,InvalidateRect而是应该打电话但是没有找到任何关于为什么不发送的信息.那为什么不呢?
更新适用InvalidateRect但不适用SendMessage(WM_PAINT)
LRESULT CALLBACK window_proc(HWND wnd, UINT msg, WPARAM w_param, LPARAM l_param)
{
switch (msg)
{
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc = BeginPaint(wnd, &ps);
Polyline(..);
EndPaint(wnd, &ps);
return 0;
case WM_USER:
// SendMessage(wnd, WM_PAINT, NULL, NULL);
// InvalidateRect(wnd, NULL, FALSE);
return 0;
}
}
Run Code Online (Sandbox Code Playgroud) 我是x86的新手.我的问题是关于函数调用.据我所知,有三种函数调用类型:短调用(0xe8),远调用(0x9a)和近调用(0x ??).有些呼叫短呼叫一个相对呼叫(ip + = arg/cs = inv)并远远调用绝对呼叫(ip = arg/cs = arg),但接近呼叫(ip =?/ cs =?)怎么样.有人说在32位系统上调用函数far(9a)几乎肯定是错误的.为什么?x86不代表32位系统吗?far call的参数是一个扁平的地址(我们在c ++或其他语言中使用的那个)或cs:ip notated以及如何将普通地址转换为cs:ip form?还有其他函数调用类型吗?
获取第一个元素的地址std::vector并像原始数组一样使用它是否安全?数据是否连续排列?什么c ++标准说(c++98vs c++11)?这是一种常见的做法吗?
我有一些大小可能变化的数组和函数,它将指针和元素数量作为参数.管理数据并std::vector同时使用它会很棒my_func.
std::vector<int> my_vector;
void my_func(int* int_ptr, int num_ints);
// ..
my_func(&my_vector[0], my_vector.size());
Run Code Online (Sandbox Code Playgroud) PlayStation 4具有使用x86指令集的CPU.几乎所有现代PC CPU都使用x86指令集.是否有可能在没有仿真的情况下在PC上运行PS4代码(因为PS4软件将具有本机PC代码)?据我所知,我们必须首先转换PS4可执行文件,使其在Windows,Linux和/或其他操作系统上运行.这可能是个问题吗?
由于内联请求不是强制性的,编译器如何计算哪个函数应该内联?我应该在什么样的功能内联?
额外的问题.我可以拨打内联电话吗?
void func{} // normal (not-inline) function
int main()
{
func(); // normal call
// inline func(); // inline call
return 0;
}
Run Code Online (Sandbox Code Playgroud) 是否可以通过参数将无名传递char[]给函数std::string&?
#include <string>
void func(std::string&);
int main()
{
func("nameless");
return 0;
}
Run Code Online (Sandbox Code Playgroud)