gpt4 book ai didi

c++ - 为什么在多重定义的情况下 char* 和 char[] 之间存在差异?

转载 作者:行者123 更新时间:2023-11-30 01:59:30 26 4
gpt4 key购买 nike

  • 在interface.h中定义strInterface

    // interface.h
    #ifndef INTERFACE_H_
    #define INTERFACE_H_
    const char* strInterface = "the difference between char* and char array";
    #endif
  • 在OneUsing类中调用了strInterface字符串

    // oneUsingInterface.h
    #ifndef ONEUSINGINTERFACE_H_
    #define ONEUSINGINTERFACE_H_

    class OneUsing
    {
    private:
    int mData;
    public:
    OneUsing();
    OneUsing(int a);
    void print();
    };
    #endif // ONEUSINGINTERFACE_H_

    // oneUsingInterface.cpp
    #include "oneUsingInterface.h"
    #include "interface.h"
    #include <iostream>

    using namespace std;

    OneUsing::OneUsing()
    {}
    OneUsing::OneUsing(int a)
    {
    mData = a;
    }
    void OneUsing::print()
    {
    cout<<"mData: "<<mData<<" strInterface: "<<strInterface<<endl;

    }
  • 在main.cpp中,直接调用strInterface,包含了interface.h;它还包括 oneUsingInterface.h,因为将创建 OneUsing 实例。

    //main.cpp
    #include <iostream>
    #include "interface.h"
    #include "oneUsingInterface.h"

    using namespace std;

    int main()
    {
    cout<<strInterface<<endl;
    OneUsing* pObject = new OneUsing(5);
    pObject->print();
    }
  • 现在,出现的问题:

    g++ -I../boost_1_52_0/installation/prefix/include -I../boost_1_52_0/installation/prefix/lib -g -Wall -Wextra -c .//main.cpp
    g++ -I../boost_1_52_0/installation/prefix/include -I../boost_1_52_0/installation/prefix/lib -g -Wall -Wextra -c .//oneUsingInterface.cpp
    g++ -I../boost_1_52_0/installation/prefix/include -I../boost_1_52_0/installation/prefix/lib -g -Wall -Wextra main.o oneUsingInterface.o -o main
    oneUsingInterface.o:(.data+0x0): multiple definition of `strInterface'
    main.o:(.data+0x0): first defined here
    collect2: error: ld returned 1 exit status
    make: *** [main] Error 1
  • 但是,如果 strInterface 是这样定义的,那么就没有问题了:

    // interface.h
    #ifndef INTERFACE_H_
    #define INTERFACE_H_
    const char strInterface[] = "the difference between char* and char array";
    #endif

在这种情况下,有人能告诉我更多关于 char*char[] 之间区别的细节吗?

PS:我们经常在头文件中用extern关键字声明全局变量,然后在别人的实现文件中定义。

最佳答案

区别在于const char strInterface[]定义了一个常量。常量对于它们所在的每个文件都是本地的。您将在每个文件中获得一个单独的拷贝。

指针const char* strInterface指向常量数据,但指针本身不是常量。所以默认情况下它对其他翻译单元可见。

关于c++ - 为什么在多重定义的情况下 char* 和 char[] 之间存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16143269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com