C ++:将外部链接与未命名的名称空间配合使用以使用常量

时间:2019-03-09 01:42:17

标签: c++ namespaces external linkage

我的目标是,当我从main内部调用myFunction时,不必传递SIZE常量。然后,myFunction.cpp中的函数应该运行,并简单地输出数组的内容。

我已经阅读了一些有关外部链接的说明,但是我觉得我不太了解该链接在这种情况下的应用。理想情况下,除了绝对必要时,除了给包含SIZE的名称空间命名之外,不应对main.cpp进行太多更改。

main.cpp

#include <iostream>
#include "myFunction.hpp"

namespace
{
    extern const int SIZE = 10;
}

void myFunction(char []);

int main()
{
    char myArray[SIZE] = "123456789";

    myFunction(myArray);
}

myFunction.h

#ifndef MYFUNCTION_H_INCLUDED
#define MYFUNCTION_H_INCLUDED

namespace
{
    extern const int SIZE;
}

#endif // MYFUNCTION_H_INCLUDED

myFunction.cpp

#include <iostream>

void myFunction(char myArray[])
{
    for(int i = 0; i < SIZE; ++i)
    {
        std::cout << myArray[i] << " ";
    }
}

到目前为止,我仍然收到以下错误:未在该范围内声明SIZE(myFunction.cpp)。

问题:要使该示例正常工作,我该怎么做?如果可能的话,我也很喜欢为什么用这种方式处理SIZE的解释。

1 个答案:

答案 0 :(得分:0)

一个未命名的名称空间告诉编译器,内部的任何内容均不得与另一个翻译单元共享。 (也就是说,内部所有内容都具有内部链接。)只要SIZE位于未命名的命名空间中,就不能具有外部链接。 >,因此myFunction()不能看到

  

如果可能的话,我也很喜欢为什么人们会以这种方式处理SIZE。

由于您正在从事玩具练习,因此我想人们可以通过这种方式来处理共享SIZE,以便更好地了解内部和外部的联系。这是一种练习,而不是真实的示例。

举一个更现实的例子,也许版本字符串既简单又好?您的应用可能有一个显示在各个位置的版本(例如“ 1.69.8109”)。此版本可以声明为const string,供多个源文件使用。它将进入(命名的)命名空间以避免名称冲突。它可以在源文件中定义,而不是在头文件中定义,以限制版本更改时所需的重新编译量。 (仅需要重新定义定义的源,而不是每个使用版本字符串的源。)这可能是一个合理的好处,尤其是在版本号经常更改的情况下,而不必只是在准备新发行版时。

  

(摘自评论):“尝试使它正常工作。如果有帮助,您可以给持有SIZE的未命名命名空间命名”

有趣的是,锻炼指导多久会告诉您该怎么做。 (嘿,“如果”。)