相关疑难解决方法(0)

C++17新特性'inline variable' vs 继承自C的'extern'关键字

应用于变量时inline说明符和关键字有什么区别?extern

c++ inline-variable

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

是静态constexpr变量odr使用?

给出以下代码,是否使用Foo::FOO1ODR?

#include <iostream>
#include <map>
#include <string>

class Foo
{
public:
    static constexpr auto FOO1 = "foo1";
    void bar();
};

void Foo::bar()
{
    const std::map<std::string, int> m = {
        {FOO1, 1},
    };
    for (auto i : m)
    {
        std::cout << i.first << " " << i.second << std::endl;
    }
}

int main()
{
    Foo f;
    f.bar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用-O1或以上编译代码,没关系,但如果编译-O0,我得到以下错误(请参阅coliru示例:

undefined reference to `Foo::FOO1'
Run Code Online (Sandbox Code Playgroud)

表示它是ODR使用的.这是什么?


我知道上面的代码是用-O构建的,但是在一个真实的(更复杂的)情况下:

  • 代码编译并与-O2良好链接
  • 代码获取上述undefined reference …

c++ one-definition-rule c++14

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

.obj中已经定义的变量;这里发生了什么?


#pragma once

namespace foo
{
    int bar;

    int funct1();
}

Run Code Online (Sandbox Code Playgroud)

头文件

#include "head.h"

int foo::funct1()
{
    return bar;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp

#include <iostream>

#include "head.h"


int main()
{
    foo::bar = 1;
    std::cout << foo::funct1() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在head.obj中已经定义的错误LNK2005“ int foo :: bar”(?bar @ foo @@ 3HA)

我不明白发生了什么。我尝试寻找答案,但是每个人的问题都针对他们的代码,甚至看起来都不像我遇到的问题。

我没有将.cpp文件包含到main中。我没有重新定义任何内容。我实际上只是将1分配给变量,然后在同一名称空间中使用函数将其返回。如何多次定义?

c++ variables declaration definition c++14

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

我可以在类头文件中定义类的const静态实例

是否可以在类头文件中声明和定义类的const静态实例.

我想做这样的事情(来自这个类似的问题):

class PlaceID {

public:

    inline PlaceID(const std::string placeName):mPlaceName(placeName) {}

    const static PlaceID OUTSIDE;

private:
    std::string mPlaceName;
};

const PlaceID PlaceID::OUTSIDE = PlaceID("");
Run Code Online (Sandbox Code Playgroud)

如果PlaceID :: OUTSIDE的定义在源文件中,这将起作用,但如果它位于包含在多个位置的头文件中,则会导致链接错误,因为PlaceID :: OUTSIDE随后被定义多次.

我想在头文件中定义它有两个原因.首先,这将是库的一部分,我希望库只是头文件.

其次,这是我希望编译器允许"内联"此实例的使用的最重要的一个.有问题的类(不是这里用作示例的类)是一个基本类型的包装器,所有方法都是内联的,以便提供与基本类型相同的性能.如果我将此实例的定义放在源文件中,编译器将不会在编译时知道它的值,并且无法应用某些优化.

谢谢.

c++

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