簡體   English   中英

C++:使用帶有未命名命名空間的外部鏈接來使用常量變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM