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