小编陳 力*_*陳 力的帖子

如果 #pragma push_macro 没有 #pragma pop_macro 会发生什么?

#pragma pop_macro("int")

#include <iostream>
using namespace std;
#define int double
void main()
{
    int iOne = 1;
    cout << sizeof(iOne) << endl;
#pragma push_macro("int")
#undef int
    int iTwo = 2;
    cout << sizeof(iTwo) << endl;
#pragma pop_macro("int")
}
Run Code Online (Sandbox Code Playgroud)

没有 #pragma pop_macro("int")

#include <iostream>
using namespace std;
#define int double
void main()
{
    int iOne = 1;
    cout << sizeof(iOne) << endl;
#pragma push_macro("int")
#undef int
    int iTwo = 2;

    cout << sizeof(iTwo) << endl;
//#pragma pop_macro("int")
}
Run Code Online (Sandbox Code Playgroud)

我刚刚在 vs2017 …

c++ visual-studio

3
推荐指数
1
解决办法
4074
查看次数

如果vs constexpr里面的constexpr函数

最近,我修改了一些if constexprif我constexpr功能,发现他们仍然正常工作,并能进行评估时,编译时间.这是一个最小的案例:

template<int N>
constexpr bool is_negative()
{
    if constexpr  (N >= 0) return false;
    else  return true; 
}
int main()
{
    constexpr  bool v = is_negative<1>();
}
Run Code Online (Sandbox Code Playgroud)

live demo

在上面的例子中,N必须在编译时知道因为它是非类型模板参数,所以if constexpr在这里工作正常.然而,这是一个constexpr功能,因此,IIRC,它是可以让即使我更换一个返回值if constexprif:

template<int N>
constexpr bool is_negative()
{
    if  (N >= 0) return false;
    else  return true; 
}
int main()
{
    constexpr  bool v = is_negative<1>();
}
Run Code Online (Sandbox Code Playgroud)

live demo

cppref来看,所有的要求A constexpr function …

c++ compile-time constexpr if-constexpr

3
推荐指数
1
解决办法
306
查看次数

如何在找不到时消除cmake的find_package的警告?

这是我的 CMakeLists.txt 的一部分

  find_package(Catch2)
if(TARGET Catch2::Catch2)
  message("catch2 has been installed previously")
  include(Catch)
else()
  message("no target catch2")

  include(FetchContent)
  # Download and configure Catch2 for the tests
  FetchContent_Declare(
    catch2
    GIT_REPOSITORY https://github.com/catchorg/Catch2
    GIT_TAG master
    )

  FetchContent_GetProperties(catch2)
  if (NOT catch2_POPULATED)
    FetchContent_Populate(catch2)
    add_subdirectory(${catch2_SOURCE_DIR} ${catch2_BINARY_DIR})
    list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/contrib)
    include(Catch)
  endif()

endif()
Run Code Online (Sandbox Code Playgroud)

我想做的是,如果catch2可用,则直接使用,否则,自动从github下载。现在它工作正常,除了这个烦人的警告:

CMake Warning at test/CMakeLists.txt:9 (find_package):
  By not providing "FindCatch2.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "Catch2", but
  CMake did not find one.

  Could not find …
Run Code Online (Sandbox Code Playgroud)

c++ cmake

3
推荐指数
1
解决办法
2385
查看次数

为什么std :: gcd/lcm返回std :: common_type_t <M,N>而不是auto?

cppreference:

template< class M, class N>
constexpr std::common_type_t<M, N> gcd(M m, N n);    (since C++17)
Run Code Online (Sandbox Code Playgroud)

IIUC,返回正确的类型,

template< class M, class N>
constexpr auto gcd(M m, N n);    (since C++17)
Run Code Online (Sandbox Code Playgroud)

自c ++ 14以来,它具有相同的效果和更多的优点.std::common_type_t只是一个解决方法c++11.但是std::gcd从那以后c++17

c++

2
推荐指数
1
解决办法
88
查看次数

将_int64转换为字符串

提供API时我有一个问题

如果我要求他们给我一个_int6410位十六进制数字,但我的函数内部采用字符串如何有效地转换...

截至目前我只是在内部使用字符串,但出于兼容性原因,我使用的是char*c样式,因此任何系统32或64都无关紧要.这是准确的事情吗?或者我错了?

使用char*vs 有问题_int64吗?

c++

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

什么"它不适用于作为对象成员的引用"在GotW#88中意味着什么?

草药萨特:

有效并发:使用锁定层次结构来避免死锁有效并发:打破Amdahl定律!»想要#88:候选人对于"最重要的常规"2008-01-01作者:Herb Sutter一位朋友最近问我下面的例子1是否合法,如果是的话是什么意思.它引发了一个很好的讨论,我想我会在这里发布.因为它已经接近GotW风格了,所以这些年后我还以为我会做另一个名誉......不,我没有做出新年决议来恢复写作常规的GotWs.:-)

JG问题Q1:以下代码是否合法C++?

// Example 1

string f() { return "abc"; }

void g() {
const string& s = f();
  cout << s << endl;    // can we still use the "temporary" object?
}
Run Code Online (Sandbox Code Playgroud)

A1:是的.这是一个C++特性......代码是有效的,并且完全符合它的样子.

通常,临时对象仅持续到它出现的完整表达式的结尾.但是,C++故意指定将临时对象绑定到堆栈上对const的引用会延长临时对象生命周期的生命周期,从而避免了常见的悬空引用错误.在上面的示例中,f()返回的临时值一直持续到结束大括号.(注意,这仅适用于基于堆栈的引用.它不适用于作为对象成员的引用.)

最初,我认为最后一句意思是:

class A 
{
public:
    int x;
    A(const int& x_)
    {
        x = x_;
    }
};

int main()
{
    A a(1); // assign lvalue to const int&
    std::cout << a.x;
}
Run Code Online (Sandbox Code Playgroud)

但是,它显然很好用.

那么,"它对于作为对象成员的引用不起作用"是什么意思?

c++ gotw

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

如何理解“动态类型:?纯右值?纯右值表达式的静态类型””

[N4687]

3.9 [defns.dynamic.type]

动态类型

?左值?泛左值所指的最派生对象 (4.5) 的类型 [示例:如果静态类型为“指向类 B 的指针”的指针 (11.3.1) p 指向类 D 的对象,该对象派生自 B(条款13),表达式*p的动态类型为“D”。参考文献 (11.3.2) 的处理方式类似。— 结束示例 ]

3.10 [defns.dynamic.type.prvalue]

动态类型

?价值?纯右值表达式的静态类型

3.9 上关于动态类型混凝土的大多数问题。但我仍然无法理解3.10的含义。

这是cppreference的描述:

纯右值不能是多态的:它标识的对象的动态类型始终是表达式的类型。

更新:

3.9 告诉我动态类型意味着必须在运行时延迟类型的确定。

我有几个关于3.10的问题:

  1. 3.9和3.10有什么关系

  2. 为什么强调纯右值?

  3. 这是否意味着纯右值的动态和静态类型始终相同?

c++

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

为什么c ++的命名空间范围也包括文件范围(在c中)?

C(ISO/IEC 9899:2011)没有命名空间的概念,在引用全局变量的范围时,标准用途file scope:

每个其他标识符的范围由其声明的位置(在声明符或类型说明符中)确定.如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,则标识符具有文件范围,该范围终止于转换单元的末尾.如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表中,则标识符具有块作用域,该作用域终止于关联块的末尾.如果声明标识符的声明符或类型说明符出现在函数原型(不是函数定义的一部分)的参数声明列表中,则标识符具有函数原型作用域,该作用域终止于函数声明符的末尾.如果标识符指定同一名称空间中的两个不同实体,则范围可能会重叠.如果是这样,一个实体(内部范围)的范围将严格地在另一个实体(外部范围)的范围之前结束.在内部范围内,标识符指定在内部范围内声明的实体; 在外部作用域中声明的实体在内部作用域内隐藏(并且不可见).

但是,在c ++(至少ISO/IEC 14882:2011)中,file scope永远不会使用并使用命名空间范围:

命名空间定义的声明性区域是其namespace-body.在namespace-body中声明的实体被称为命名空间的成员,并且这些声明引入命名空间的声明性区域的名称被称为命名空间的成员名称.名称空间成员名称具有名称空间范围 它的潜在范围包括从名称的声明点开始的命名空间; 对于指定成员名称空间的每个using-directive([namespace.udir]),成员的潜在范围包括在成员的声明点之后的using-directive的潜在范围部分.

我们知道,c ++受到了很多C语言的启发,因此许多术语的定义也来自c,尽管它们现在几乎是两种不同的语言.IMO,应该有一个原因,c ++使用命名空间范围而不是文件范围,但我不知道.背后是什么?

c++ scope namespaces language-lawyer

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

错误:'std :: __ cxx11 :: list <User> :: iterator'{aka'struct std :: _ List_iterator <User>'}没有名为XXX的成员

我正在学习C++,但是我的第一堂课出错了.我需要帮助才能理解这段代码的错误.

我收到以下错误消息:

main.cpp:36:13: error: 'std::__cxx11::list<User>::iterator' {aka 'struct std::_List_iterator<User>'} has no member named
 'printInfo'
         usr.printInfo();
             ^~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

主函数提示用户输入其名称,创建列表和列表迭代器,显示两个用户的信息

main()函数:

#include <iostream>
#include <list>
#include "User.cpp"
using namespace std;
int main() {
    string str0 ="";
    usrs players; 
    players = create_2user();
    list<User> playerList = { players.usr0, players.usr1 };
    for( list<User>::iterator usr = playerList.begin(); usr != playerList.end(); usr++) {
        usr.printInfo();
    }       
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

班级User:

class User {
    string name;
    public:
        User();      
        void set_name (string in_name);     
        string get_name();
        void printInfo();
}; …
Run Code Online (Sandbox Code Playgroud)

c++

1
推荐指数
2
解决办法
160
查看次数

aarch64 有条件加载/存储的方式是什么?

我知道armv7可以使用条件代码进行加载/存储,例如ldrne/streq。但A64不允许指令有条件执行。那么我怎样才能在arm64中存档这个:

ands    tmp1, dstend, 7 # set nzcv flag with ands
# if not zero, ldr w6, [srcend, -4]!, str w6, [dstend, -4]!
# else, do nothing and goes on
...
Run Code Online (Sandbox Code Playgroud)

assembly if-statement conditional-statements arm64

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

优化循环C++

我有这个小功能循环通过矢量来找到一个给定的动物并返回它的栖息地.我需要对它进行优化,但是我正在做我可以做的事情.突然出现在我身上的三件事是size_t,i++以及我正在通过矢量循环的事实.我读到这size_t对于具有大尺寸索引的数组非常有用.我知道这pre-incrementpost-increment改变原始值而不是创建临时值和增量更好.但编译器通常会优化这个小差异.最后,我想到的最后一件事是这个向量可能是未分类的,因此在性能方面有所下降.我正在考虑按动物的物种变量对载体进行分类,然后可能将其移植到一个BST搜索中,因为时间复杂度会是这样O(log(n)).这是我正在使用的代码:

string GetAnimalHabitat(vector<Animal> animals, string species)
{
    for (size_t i = 0; i < animals.size(); i++)
    {
        if (animals[i].species == species)

        {
            return animals[i].habitat;
        }
    }
    return "Animal not within records.";
}
Run Code Online (Sandbox Code Playgroud)

有什么我可能遗失的东西可以改善这个功能吗?任何提示都会很棒.谢谢!

c++ optimization for-loop vector

0
推荐指数
1
解决办法
116
查看次数