c語言指數常數的正确表示形式?visual C 編譯器在編譯函數時,會對函數名進行修飾,現在小編就來說說關于c語言指數常數的正确表示形式?下面内容希望能幫助到你,我們來一起看看吧!
visual C 編譯器在編譯函數時,會對函數名進行修飾。
如果沒聽過函數名修飾,咱們先做個試驗,有個直觀的認識。
#include "stdafx.h"
extern void func(int a,int b,long c);
int main(int argc, char* argv[])
{
func(1,2,5);
printf("Hello World!\n");
return 0;
}
如以上代碼所示,func函數隻有聲明,沒有定義。 這個工程也之後這一個c文件。
我們編譯工程,得到如下錯誤。
error LNK2001: unresolved external symbol "void __cdecl func(int,int,long)" (?func@@YAXHHJ@Z)
無法解析的外部符号?func@@YAXHHJ@Z ,看到了嗎,func函數在後台的名字是?func@@YAXHHJ@Z
這就是對函數名的修飾。
為什麼是?func@@YAXHHJ@Z 這樣的呢?
函數名的修飾規則是:? 函數名 @@ 調用規則 返回值類型 參數類型 @Z
調用規則VC 包含三種:
1.__cdecl在修飾規則裡是YA,我們的例子中就是這種, ?func@@YAXHHJ@Z。
2.__stdcall在命令規則裡是YG 。
3.__fastcall在命令規則裡是YI。
這三種調用規則對于函數參數的傳遞方式和入棧順序也不同,我們以後在講。
返回值類型和參數類型如下:
X--void
D--char
E--unsigned char
F--short
H--int
I--unsigned int
J--long
K--unsigned long(DWORD)
M--float
N--double
_N--bool
U--struct
以上就是visual C 編譯器的函數修飾規則。确切的說是C 語言的修飾規則。
那麼 extern “C"是什麼呢?
這個符号是告訴編譯器,按C語言的修飾規則修飾。
我們加上“C",看看C語言的修飾規則是什麼樣的。
#include "stdafx.h"
extern "C" void func(int a,int b,long c);
int main(int argc, char* argv[])
{
func(1,2,5);
printf("Hello World!\n");
return 0;
}
編譯結果如下:
error LNK2001: unresolved external symbol _func
看到了嗎,C語言的規則就是簡單的在函數名前面,加了一個下劃線。
那麼我們為什麼要折騰函數名的修飾規則呢?有什麼用?
比如當你調用别人編譯的庫時,就需要知道對方是用什麼規則編譯的,你調用的時候也要用這種規則,不然就會提示“error LNK2001: unresolved external symbol XXXX” 這種錯誤。
當你編譯工程時,提示此錯誤,可以查查是不是函數修飾規則的問題。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!