我的目标是,当我从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的解释。
答案 0 :(得分:0)
一个未命名的名称空间告诉编译器,内部的任何内容均不得与另一个翻译单元共享。 (也就是说,内部所有内容都具有内部链接。)只要SIZE
位于未命名的命名空间中,就不能具有外部链接。 >,因此myFunction()
不能看到。
如果可能的话,我也很喜欢为什么人们会以这种方式处理SIZE。
由于您正在从事玩具练习,因此我想人们可以通过这种方式来处理共享SIZE
,以便更好地了解内部和外部的联系。这是一种练习,而不是真实的示例。
举一个更现实的例子,也许版本字符串既简单又好?您的应用可能有一个显示在各个位置的版本(例如“ 1.69.8109”)。此版本可以声明为const string
,供多个源文件使用。它将进入(命名的)命名空间以避免名称冲突。它可以在源文件中定义,而不是在头文件中定义,以限制版本更改时所需的重新编译量。 (仅需要重新定义定义的源,而不是每个使用版本字符串的源。)这可能是一个合理的好处,尤其是在版本号经常更改的情况下,而不必只是在准备新发行版时。
(摘自评论):“尝试使它正常工作。如果有帮助,您可以给持有SIZE的未命名命名空间命名”
有趣的是,锻炼指导多久会告诉您该怎么做。 (嘿,“如果”。)