[英]C++: Using external linkage with an unnamed namespace to use a constant variable
我的目標是,當我從 main 中調用 myFunction 時,我不必傳遞 SIZE 常量。 然后應運行 myFunction.cpp 中的函數並簡單地輸出數組的內容。
我已經閱讀了一些關於外部鏈接的注釋,但我覺得我對它的理解不夠好,無法在這種情況下應用任何東西。 理想情況下,除了在絕對必要的情況下為包含 SIZE 的名稱空間命名外,不應更改 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。
Am unnamed namespace 告訴編譯器里面的任何東西都不會與另一個翻譯單元共享。 (也就是說,里面的所有東西都有內部鏈接。)只要SIZE
在一個未命名的命名空間中,它就不能有外部鏈接,所以它不能被myFunction()
看到。
如果可能的話,我也很想解釋一下為什么要以這種方式處理共享 SIZE。
由於您正在使用玩具練習,我的猜測是人們會以這種方式處理共享SIZE
以更好地理解內部和外部鏈接。 這是一個練習,而不是一個現實世界的例子。
對於更現實的示例,也許版本字符串既簡單又好? 您的應用程序可能有一個版本(例如“1.69.8109”),它會在不同時間點顯示。 這個版本可以聲明為一個const string
,供多個源文件使用。 它將進入(命名)命名空間以避免名稱沖突。 它可以在源文件而不是頭文件中定義,以限制版本更改時所需的重新編譯量。 (只有帶有定義的源需要重新編譯,而不是每個使用版本字符串的源。)這可能是一個合理的好處,特別是如果版本號經常發生合理的變化,不一定只是在准備新版本時。
(來自評論): “嘗試讓它發揮作用。如果有幫助,您可以為包含 SIZE 的未命名命名空間命名”
有趣的是,練習的說明經常會告訴您該做什么。 (呵呵,“如果”。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.