这个问题的灵感来自于此处的评论.
请考虑以下代码段:
struct X {}; // no virtual members
struct Y : X {}; // may or may not have virtual members, doesn't matter
Y* func(X* x) { return dynamic_cast<Y*>(x); }
Run Code Online (Sandbox Code Playgroud)
有几个人建议他们的编译器会拒绝它的主体func.
但是,在我看来,这是否由标准定义取决于运行时的值x.从5.2.7([expr.dynamic.cast])部分:
表达式
dynamic_cast<T>(v)的结果是将表达式转换v为type 的结果T.T应该是对完整类类型的指针或引用,或者是"指向cv的 指针void".该dynamic_cast经营者不得抛弃常量性.如果
T是指针类型,则v应该是指向完成类类型的指针的prvalue,结果是类型的prvalueT.如果T是左值引用类型,则v应该是完整类类型的左值,结果是由引用的类型的左值T.如果T是右值引用类型,则v应该是具有完整类类型的表达式,并且结果是由引用的类型的xvalueT.如果类型
v是相同的T …
我正在尝试编译这段代码,但无论出于何种原因它都无法正常工作.有人能帮我吗?我想知道如何正确使用strlen():
#include<iostream>
using namespace std;
int main()
{
char buffer[80];
cout << "Enter a string:";
cin >> buffer;
cout << strlen(buffer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用cin.getline(buffer,80); 但我得到了相同的编译错误问题.
我的编译器说错误就是这个
错误:strlen未在此范围内声明
我想成为iPhone,Java ME和Android等手机的OpenGL编程.有没有好的初学者教程开始?
我有一个应用程序,我们称之为myapp.exe,这是双模式控制台/ GUI,内置为/ SUBSYSTEM:WINDOWS(有一个小的3KB垫片myapp.com使cmd.exe等待显示新提示.)
如果我从命令提示符启动:
myapp - > cmd.exe运行运行myapp.exe的myapp.com.stdout最初是一个独立的控制台,通过使用AttachConsole,freopen("CONOUT$", "w", stdout)我的输出显示在命令框中.好myapp.exe - > cmd.exe显示提示太早(已知问题),否则与之前相同.不是正常的使用场景.myapp > log- > stdout是一个文件,正常使用std::cout最终在文件中.好如果我从Windows资源管理器启动:
myapp.com - >创建控制台,stdout是控制台,输出进入控制台.使用/ SUBSYSTEM:CONSOLE用于整个程序的结果相同,只是我myapp.com在控制台中唯一的进程时添加了一个暂停.不是正常的使用场景.myapp.exe- > stdout是一个NULL句柄,我检测到这个并挂钩std::cout到GUI.好如果我从Matlab shell启动:
system('myapp')或者system('myapp.com')或system('myapp.exe')- >对于所有三种变型中,标准输出通过管道输送到MatLab的.好如果我从cygwin bash shell启动:
./myapp.com - >就像从cmd.exe启动一样,输出显示在命令框中.好./myapp- >(bash发现./myapp.exe). 这是破案.stdout是一个非NULL句柄,但输出无处可去.这是从bash运行程序的正常情况,需要修复!./myapp > log - >就像从带有文件重定向的cmd.exe启动一样.好./myapp | cat - >与文件重定向类似,但输出最终在控制台窗口中.好有没有人知道cygwin在启动/ SUBSYSTEM:WINDOWS进程时设置为stdout以及如何绑定std::cout它?或者至少告诉我如何找出我从哪个手柄回来GetStdHandle(STD_OUTPUT_HANDLE)?
我的程序是用Visual C++ 2010编写的 …
我有兴趣了解是否有为Apple iOS开发的IDE?我目前正在学习Objective-C,但我没有Macbook或类似的东西.
所以实际上我正在寻找一个"全能"IDE,包括:
我还需要在Ubuntu上开发iPhone应用程序(如果可能的话)?
谢谢你的任何建议.
这是一个面试问题: -
编写一个C程序,在编译和运行时,打印出一条消息,指示编译它的编译器是否允许嵌套/**/comments.
这个问题的解决方案如下: -
Sol: - 你可以有一个整数变量nest:
int nest = /*/*/0*/**/1;
Run Code Online (Sandbox Code Playgroud)
如果它支持嵌套注释,则答案为1,否则答案为0.
这是怎么回事?我不明白变量声明.
从Visual C++ 2005开始,Microsoft为访问volatileC++标准不需要的类型提供了额外的排序保证.
C++标准中的任何内容是否真的禁止这些保证? Microsoft文档似乎这么认为.
请告诉我标准是否允许Microsoft实施的订购,并对此错误报告进行投票:
码:
// test3.cpp
#include <stack>
using namespace std;
template<typename T>
struct ptr_stack_tp;
template<typename T>
struct ptr_stack_tp<T*> : public stack<T*>
{
~ptr_stack_tp()
{
while (!empty()) {
operator delete(top());
pop();
}
}
};
int main()
{}
Run Code Online (Sandbox Code Playgroud)
错误消息(gcc 4.7.2):
test3.cpp: In destructor 'ptr_stack_tp<T*>::~ptr_stack_tp()':
test3.cpp:15:23: error: there are no arguments to 'empty' that depend on a template parameter, so a declaration of 'empty' must be available [-fpermissive]
test3.cpp:15:23: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an …Run Code Online (Sandbox Code Playgroud) 人们建议大范围#ifdef进行条件编译.一个搜索#ifdef证实,它的使用是很普遍的.
然而#ifdef NAME(或等同#if defined(NAME)和相关#ifndef NAME(和#if !defined(NAME))有一个严重的缺陷:
#ifndef IS_SPECIAL
#error You're not special enough
#endif
Run Code Online (Sandbox Code Playgroud)
#include "header.h"
Run Code Online (Sandbox Code Playgroud)
gcc -DIS_SPECIAL source.cpp
显然,将会通过
#define IS_SPECIAL 1
#include "header.h"
Run Code Online (Sandbox Code Playgroud)
但是,也一样
#define IS_SPECIAL 0
#include "header.h"
Run Code Online (Sandbox Code Playgroud)
这是完全错误的事情.而一些C++编译器,传递一个以C模式处理的文件(由于扩展或命令行选项)有效#define __cplusplus 0.我看到事情破裂了
#ifdef __cplusplus
extern "C" {
#endif
/* ... */
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
在C模式下处理,其中extern "C"语法无效,因为__cplusplus实际上是自动定义的0. …
c++ ×6
c ×2
c# ×1
c++11 ×1
comments ×1
cygwin ×1
dynamic-cast ×1
ide ×1
ios ×1
linux ×1
objective-c ×1
opengl-es ×1
polymorphism ×1
stack ×1
stdout ×1
templates ×1
virtual ×1
visual-c++ ×1