簡體   English   中英

在C和C ++中,“在此范圍內未聲明變量”

[英]“Variable was not declared in this scope” in C and C++

我今天發現C和C ++之間存在差異。 我把程序分成兩個不同的文件,這是我的C測試:

/* in file main.c*/
#include <stdio.h>

int main()
{
    int a = 3, b = 4;
    int c = sum(a, b);
    printf("%d\n", c);
}

/* In file sum.c */
#include <stdio.h>

int sum(int x, int y)
{
    return x + y;
}

然后,我編譯了gcc main.c sum.c ,沒有錯誤,結果是正確的。 以下是我的C ++測試,我還將它們分成兩個不同的文件:

/* in file main.cpp*/
#include <iostream>

int main()
{
    int a = 3, b = 4;
    int c = sum(a, b);
    std::cout << c << std::endl;
}

/* In file sum.cpp */
#include <iostream>

int sum(int x, int y)
{
    return x + y;
}

編譯它們g++ main.cpp sum.cpp 發生錯誤: error: 'sum' was not declared in this scope 如果我在main.cpp文件中放入一個聲明int sum(int, int) ,則不會發生錯誤。 為什么C和C ++之間存在這樣的差異? 什么是解決它的最佳方法?

它是C ++引入的一個特性:除非你真的看過聲明或定義,否則不要假設你知道函數簽名。 在編譯器和鏈接過程中更容易報告不正確的函數使用,並且使用C ++名稱修改,需要確切的參數類型來知道代碼需要鏈接的符號 - 類型確定基於與候選者的匹配,可以進行各種標准轉換/隱式構造/隱式轉換。

解決這個問題的正確方法是創建一個sum.h頭文件:

#ifndef SUM_H
#define SUM_H
int sum(int, int);
#endif

這應該包含在第一行或sum.cpp (如果sum.h內容演變為依賴於<iostream>內容但是忘記將其自身包含在內,則會出現錯誤),並且在main.cpp之前或之后其他包括你喜歡(我擔心大多數人會追求,但這是一個風格的選擇)。

當然,創建h文件是最好的選擇。 但至少你可以在main之前包含sum函數聲明,例如:

/* in file main.c*/
#include <stdio.h>

// external function declaration (instead of h-file)
int sum(int, int);

int main()
{
    int a = 3, b = 4;
    int c = sum(a, b);
    printf("%d\n", c);
    return 0;
}

暫無
暫無

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

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