簡體   English   中英

main.cpp怎么看?

[英]How does main.cpp see this?

剛開始是用C ++編寫的,所以有點菜鳥,不知道為什么會這樣。 main.cpp如何看待使用單獨的print.cpp文件中包含的print()函數? 我以為您必須使用#include / header文件或類似的文件? 如果有幫助,我正在使用Visual Studio。

main.cpp

#include "stdafx.h"
#include <iostream>
#include <string>

void print(std::string message);

int main()
{
    std::cout << "Enter message: ";
    std::string message = "";
    std::getline(std::cin, message);
    print(message);
    return 0;
}

print.cpp

#include "stdafx.h"
#include <iostream>
#include <string>

void print(std::string message)
{
    std::cout << "Your message is - " << message << std::endl;
}

實際上,main.cpp 的代碼根本無法“看到” print.cppprint功能

編譯器根據您先前在文件中編寫的不完整函數規范(而不是來自其他文件的任何內容)檢查對print的調用。 C ++允許使用這種不完整的規范作為一種說法,“好吧,我現在不告訴您如何實現此功能,但是在編譯了該文件和所有其他文件並准備好鏈接在一起之后,應該可以使用它。一些現有的庫。”

您提到了包含文件。 include指令所做的全部工作是(除其他事項外)直接在程序內部放置一堆局部函數規范。 包含之后(在編譯器運行之前作為預處理階段運行),您將擁有一些類似於上面的main.cpp的代碼。 實際上,對於C ++編譯器,您的代碼看起來與用不規范的print函數規范替換為包含該規范的文件的#include指令的代碼看上去沒有什么不同。

關於編寫不完整的函數規范的一個有趣的事情是,實現這些規范的函數通常可以用不同的語言編寫,只要它們的數據類型直接映射到C ++類型即可。 在您的情況下, std::string將您直接綁定到C ++,但是如果您使用int甚至char*使用匯編語言或C語言的外部程序,則可以使用!

可以在單獨的翻譯單元中編譯代碼的原因是鏈接 :鏈接是名稱的屬性,名稱具有三種鏈接,這些鏈接決定了在不同范圍內看到名稱時的含義:

  • 無:沒有鏈接的名稱的含義對於該名稱出現的范圍是唯一的。 例如,“正常”的變量的函數內聲明沒有聯動,所以名字ifoo()具有從所述名稱的不同意義ibar()

  • 內部的:具有內部鏈接的名稱的含義在每個翻譯單元內是相同的,但在翻譯單元之間是不同的。 一個典型的例子是在名稱空間范圍內聲明的變量名稱,這些變量是常量,或出現在未命名的名稱空間中,或使用static說明符。 舉一個具體的例子, static int n = 10; 在一個.cpp文件中聲明的名稱在該文件內使用該名稱的每次使用均指代同一實體,但在不同文件中使用不同的static int n指代不同的實體。

  • 外部:在整個程序中,具有外部鏈接的名稱的含義相同。 也就是說,無論您在聲明具有外部鏈接的特定名稱時,該名稱都指的是同一事物。 這是名稱空間范圍內函數和非常量函數的默認鏈接,但是您也可以顯式請求與extern說明符的外部鏈接。 例如, extern int a; 將在程序中的任何地方引用相同的int對象。

現在,我們了解您的程序如何組合在一起(或:“鏈接”):名稱print具有外部鏈接(因為它是函數的名稱),因此程序中的每個聲明都引用相同的函數。 在main.cpp中有一個用於調用該函數的聲明,而在print.cpp中還有一個用於定義該函數的聲明,這兩個含義相同。這意味着您在main調用的東西與您所調用的東西完全相同。在print.cpp中定義。

頭文件的使用沒有任何魔術:頭文件只是在文本上被替換,現在我們精確地看到了什么頭文件有用:它們對於保存具有外部鏈接的名稱聲明非常有用,以便任何想要引用的人因此,實體名稱具有將這些聲明包含在其代碼中的簡便且可維護的方式。

您可以完全不使用標題,但是這將要求您准確地知道如何聲明所需的名稱,這通常是不希望的,因為聲明的細節由庫所有者(而不是用戶)擁有,並且圖書館所有者有責任維護和運送聲明。

現在,您還將看到翻譯工具鏈中“鏈接器”部分的目的是:鏈接器將對具有外部鏈接的名稱的引用進行匹配。 鏈接器在第一個翻譯單元中的print名稱引用中使用已定義實體的最終地址,該實體的名稱(來自第二個翻譯單元)位於最終鏈接中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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