小编Ben*_*igt的帖子

符合标准的编译器是否可以拒绝包含非多态类型的dynamic_cast downcast的代码?

这个问题的灵感来自于此处的评论.

请考虑以下代码段:

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])部分:

  1. 表达式dynamic_cast<T>(v)的结果是将表达式转换v为type 的结果T.T应该是对完整类类型的指针或引用,或者是"指向cv的 指针void".该 dynamic_cast经营者不得抛弃常量性.

  2. 如果T是指针类型,则v应该是指向完成类类型的指针的prvalue,结果是类型的prvalue T.如果T是左值引用类型,则v应该是完整类类型的左值,结果是由引用的类型的左值T.如果T是右值引用类型,则v应该是具有完整类类型的表达式,并且结果是由引用的类型的xvalue T.

  3. 如果类型v是相同的T …

c++ polymorphism virtual dynamic-cast language-lawyer

15
推荐指数
1
解决办法
329
查看次数

使用strlen()时"未在此范围内声明"

我正在尝试编译这段代码,但无论出于何种原因它都无法正常工作.有人能帮我吗?我想知道如何正确使用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未在此范围内声明

c++

15
推荐指数
2
解决办法
6万
查看次数

OpenGL(适用于移动设备)初学者教程

我想成为iPhone,Java ME和Android等手机的OpenGL编程.有没有好的初学者教程开始?

opengl-es

14
推荐指数
1
解决办法
9281
查看次数

从cygwin shell启动时写入stdout的位置是什么,没有重定向

我有一个应用程序,我们称之为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编写的 …

cygwin stdout

14
推荐指数
1
解决办法
4388
查看次数

适用于Linux的Apple iOS IDE?

我有兴趣了解是否有为Apple iOS开发的IDE?我目前正在学习Objective-C,但我没有Macbook或类似的东西.

所以实际上我正在寻找一个"全能"IDE,包括:

  • Objective-C编译器
  • Objective-C调试器
  • 测试开发的应用程序(如iPhone模拟器)的可能性

我还需要在Ubuntu上开发iPhone应用程序(如果可能的话)?

谢谢你的任何建议.

linux ide objective-c ios

14
推荐指数
2
解决办法
2万
查看次数

C/C++中的嵌套注释

这是一个面试问题: -

编写一个C程序,在编译和运行时,打印出一条消息,指示编译它的编译器是否允许嵌套/**/comments.

这个问题的解决方案如下: -

Sol: - 你可以有一个整数变量nest:

int nest = /*/*/0*/**/1;
Run Code Online (Sandbox Code Playgroud)

如果它支持嵌套注释,则答案为1,否则答案为0.

这是怎么回事?我不明白变量声明.

c c++ comments

14
推荐指数
2
解决办法
9996
查看次数

C++ 11是否允许(不要求)发布/获取volatile关键字的语义

从Visual C++ 2005开始,Microsoft为访问volatileC++标准不需要的类型提供了额外的排序保证.

C++标准中的任何内容是否真的禁止这些保证? Microsoft文档似乎这么认为.

请告诉我标准是否允许Microsoft实施的订购,并对此错误报告进行投票:

c++ visual-c++ language-lawyer c++11

14
推荐指数
1
解决办法
575
查看次数

C#中有虚拟课吗?

我已经阅读了C#中的虚拟方法.在C#中是否有任何称为虚拟类的概念?C#中的抽象类和C++中的虚拟类是一样的吗?

c#

14
推荐指数
2
解决办法
2万
查看次数

对从属基类成员的非限定访问会导致"[x]的声明必须可用"

码:

// 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)

c++ stack templates

14
推荐指数
1
解决办法
8731
查看次数

为什么人们使用#ifdef进行功能标记测试?

人们建议大范围#ifdef进行条件编译.一个搜索#ifdef证实,它的使用是很普遍的.

然而#ifdef NAME(或等同#if defined(NAME)和相关#ifndef NAME(和#if !defined(NAME))有一个严重的缺陷:

header.h

#ifndef IS_SPECIAL
#error You're not special enough
#endif
Run Code Online (Sandbox Code Playgroud)

source.cpp

#include "header.h"
Run Code Online (Sandbox Code Playgroud)

gcc -DIS_SPECIAL source.cpp

显然,将会通过

source1.cpp

#define IS_SPECIAL 1
#include "header.h"
Run Code Online (Sandbox Code Playgroud)

但是,也一样

source0.cpp

#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 c++ conditional-compilation c-preprocessor

14
推荐指数
1
解决办法
4012
查看次数