草庐IT

全局剪枝

全部标签

c++ - 如何允许全局函数访问私有(private)成员

如何允许全局函数访问私有(private)成员?限制是你不能直接friend类声明中的全局函数。原因是因为我不希望用户必须在头文件中看到所有这些全局函数。函数本身是在实现文件中定义的,我希望尽可能将它们隐藏在那里。现在您可能想知道为什么我有这么多这样的全局函数。为简单起见,我将各种WNDPROC函数与windows注册为回调,并且它们必须是全局的。此外,他们必须能够更新对不同类来说是私有(private)的信息。我提出了2个解决方案,但都有些棘手。解决方案1.制作所有需要后门的成员protected而不是private.在实现文件中,声明一个继承自原始类但为protected成员提供公

c++ - 内联成员函数使用的静态全局变量

当您在C++头文件中有一个静态全局变量时,包含该头文件的每个翻译单元都以其自己的变量拷贝结束。但是,如果我在同一个头文件中声明一个类,并创建该类的成员函数,在类声明中内联实现,它使用静态全局变量,例如:#includestaticintn=10;classFoo{public:voidprint(){std::cout然后我在gcc4.4下看到了一些奇怪的行为:如果我在没有优化的情况下进行编译,则成员函数的所有使用都使用来自其中一个翻译单元(g++命令行中提到的第一个单元)的变量拷贝。如果我使用-O2进行编译,则每次使用成员函数时都会使用生成案例的翻译单元中的变量拷贝。显然这是非常糟糕

c++ - 在没有全局或静态变量的情况下配置 Bison 和 Flex

我正在使用小型语言/IDE工作。我需要知道如何配置flex和bison一起工作,但不使用任何全局或静态变量。我需要将我的AST指针传递给Bison。我还需要bison也将我的AST传递给flex。这是一个线程环境,但我不需要任何线程同步。我需要为每个yyparse()调用一个单独的yylineno变量。我读到了%defineapi.pure、%parse-param和%option可重入。但我不知道如何让它们一起工作...提前谢谢...我试过这个:扫描仪.l:%{#include#include#include"parser.tab.h"#defineYY_DECLextern"C"i

c++ - 默认情况下,局部变量和全局变量是如何初始化的?

基于以下,我是对的吗?global_A引用被初始化为null。global_int为0local_A引用为空local_int未初始化global_A.x和local_A.x均未初始化。感谢您的帮助。Aglobal_A;intglobal_int;classA{public:intx;}intmain(){intlocal_int;Alocal_A;} 最佳答案 以安德烈的回应为基础。$3.6.2-“具有静态存储持续时间(3.7.1)的对象应在任何其他初始化发生之前进行零初始化(8.5)。”。在OP中,“global_A”和“glo

c++ - 何时用单例替换全局 std::unique_ptr

一位同事坚持对所有全局指针变量使用Meyer的Singleton,因为“不能保证全局unique_ptr的构造不会抛出”。所以不是:#includestd::unique_ptrptr(nullptr);//Apparentlythisisn'tsafe.intmain(/*blah*/){ptr.reset(newFoo());}我们现在有unique_ptrsingleton{try{staticunique_ptrptr();returnptr;}catch(...){std::cerr();}intmain(){}对我来说,这似乎是一种寻找问题的解决方案。他有道理吗?

c++ - 头文件中的全局函数定义——如何避免重复符号链接(symbolic link)错误

我在仅header文件中有以下代码。#pragmaonceclasserror_code{public:unsigned__int64hi;unsigned__int64lo;};std::ostream&operator当项目中有2个cpp包含此头文件时,出现链接错误。errorLNK2005:"classerror_code__cdecloperator|(classerror_codeconst&,classViTrox::error_codeconst&)"(??U@@YA?AVerror_code@0@ABV10@0@Z)alreadydefinedinxxx.obj我知道我

c++ - 全局变量减慢代码

我正在写我能写的最糟糕的代码,(基本上是想破坏东西)我注意到这段代码:for(inti=0;i其中N是一个全局变量,运行速度明显较慢:intN=10000;for(inti=0;i全局变量会导致运行速度变慢怎么办? 最佳答案 tl;dr:本地版本将N保存在寄存器中,全局版本则不会。使用const声明常量,无论您如何声明它都会更快。这是我使用的示例代码:#include#includevoidfirst(){intx=1;intN=10000;for(inti=0;i(名为test.cpp)。为了查看生成的汇编代码,我运行了g++-S

c++ - 如何访问既不是全局变量也不是局部变量的变量?

看这段代码intx=1;intmain(intargc,char*argv[]){intx=2;{intx=3;cout当我从block内调用x时,我得到3。当我调用::x时,我得到1。是否可以从block内调用x等于2? 最佳答案 作弊:intx=1;intmain(intargc,char*argv[]){intx=2;{int&ox=x;intx=3;cout 关于c++-如何访问既不是全局变量也不是局部变量的变量?,我们在StackOverflow上找到一个类似的问题:

c++ - 如何在 C++11 中为全局命名空间设置别名

简写:如何在C++11中为根(全局)命名空间定义别名?它可能看起来像namespaceroot_namespace=::;上面裸形式的范围解析运算符是全局命名空间的某个句柄的占位符。我读了GCCInternalsManual那个...[编译器]整个中间表示的根是变量global_namespace。这是用::指定的命名空间在C++源代码中...全局命名空间的名称是::,即使在C++中全局命名空间是未命名的。PSEDIT:对于迄今为止的受访者,我在以下长表之后附加了一个painfullylongform来解决一些问题,因为它可能澄清一些事情。追随者,如果你看到我们在交谈而不是互相交谈,请

c++ - 使用 SFINAE 检查全局运算符<<?

我想要几个重载的全局to_string()函数,它们采用某种类型的T并将其转换为其字符串表示形式。对于一般情况,我希望能够写:templateinlinetypenameenable_if::value&&has_insertion_operator::value,void>::typeto_string(Tconst&t,OutputStringType*out){std::ostringstreamo;o到目前为止,我对has_insertion_operator的实现是:structsfinae_base{typedefcharyes[1];typedefcharno[2];};