❶ C語言中顯示無法解析的外部命令
這是因為c和c++混編帶來的問題。
1,問題根源:c++是支持類和名字空間,函數重載等高級技巧的。以函數重載為例:
int Add(int a, int b)
int Add(int a, int b, int c)
這意味著不同的函數有同樣的名字(你寫的,都叫Add),但是同樣的名字會帶來混淆,所以使用了一種叫「名字毀壞」的技術,不同的編譯器有不同的毀壞規則,只要能實現區分就好。
所以,經過c++編譯器的處理,你的Add名字已經面目全非,比如我這里叫:
錯誤 LNK2019 無法解析的外部符號 "int __fastcall Add(int,int)" (?Add@@YIHHH@Z),函數 _main 中引用了該符號。
到這,都沒什麼,只不過名字變了一下,只要編譯器能處理正確就好。
但是,重點來了,你放了一個c文件進去,c語言,是不支持這些高級玩意兒的,名字也不會毀壞,這樣,一個毀壞一個還是原名,得,兩下對不上了。
2,解決辦法
解決辦法也是模式化的,當你聲明的變數或者函數在c文件實現的時候,在h文件里聲明的時候,用這樣的結構包含起來,無論有多少個函數,都可以放在一起。
#ifdef __cplusplus
extern "C" {
#endif
int Add(int, int);
//其他聲明
#ifdef __cplusplus
}
#endif
再編譯就不會出現Link錯誤了。
頭文件全文如下:
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
int Add(int, int);
#ifdef __cplusplus
}
#endif
❷ 如何在Qt中使用全局變數,出現無法解析的
很多小夥伴在Qt編程時,不會使用全局變數,其實基本有兩種方式來定義使用全局變數,第一種是根據c/c++的extern來進行多文件的使用,第二種方法就是把全局變數放在類中,當做類靜態變數來使用,一般來說,第一種方式嚴重破壞了類的封裝,所以還是推薦第二種方式.下面給出簡單的示例:
1.先在一個.h文件中聲明一個類://c.h#ifndef C_H#define C_Hclass QPos{public:static int x; //注意關鍵字staticstatic int y;
};#endif //C_H2.在.cpp文件里類中的成員進行定義://c.cpp#include "c.h"int QPos::x = 10; //必須要在對應的.cpp文件中進行初始化,否則會被報錯!!int QPos::y = 20;3.然後就可以在其他文件中使用這些全局變數了.//m.cpp#include#include "c.h"m::m(QWidget *parent) : QWidget(parent)
{
ui.setupUi(this);
c::x= 50; /
c::y= 70;
...
}
–
切記對靜態變數必須的初始化必須要在類外進行,同時不能在.h頭文件中進行,應該在對應的.cpp中進行,否則會出現無法解析的錯誤.