當前位置:首頁 » 編程語言 » c語言的入口函數名
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言的入口函數名

發布時間: 2022-01-18 09:33:42

⑴ 在c語言中有那些函數名

僅僅為了獲取函數名,就在函數體中嵌入硬編碼的字元串,這種方法單調乏味還易導致錯誤,不如看一下怎樣使用新的C99特性,在程序運行時獲取函數名吧.對象反射庫、調試工具及代碼分析器,經常會需要在運行時訪問函數的名稱,直到不久前,唯一能完成此項任務並且可移植的方法,是手工在函數體內嵌入一個帶有該函數名的硬編碼字元串,不必說,這種方法非常單調無奇,並且容易導致錯誤。本文將要演示怎樣使用新的C99特性,在運行時獲取函數名。

那麼怎樣以編程的方式從當前運行的函數中得到函數名呢?

答案是:使用__FUNCTION__ 及相關宏。

引出問題

通常,在調試中最讓人心煩的階段,是不斷地檢查是否已調用了特定的函數。對此問題的解決方法,一般是添加一個cout或printf()——如果你使用C語言,如下所示:

void myfunc()
{
cout<<"myfunc()"<<endl;
//其他代碼
}

通常在一個典型的工程中,會包含有數千個函數,要在每個函數中都加入一條這樣的輸出語句,無疑難過上「蜀山」啊,因此,需要有一種機制,可以自動地完成這項操作。

獲取函數名

作為一個C++程序員,可能經常遇到 __TIME__、__FILE__、__DATE__ 這樣的宏,它們會在編譯時,分別轉換為包含編譯時間、處理的轉換單元名稱及當前時間的字元串。

在最新的ISO C標准中,如大家所知的C99,加入了另一個有用的、類似宏的表達式__func__,其會報告未修飾過的(也就是未裁剪過的)、正在被訪問的函數名。請注意,__func__不是一個宏,因為預處理器對此函數一無所知;相反,它是作為一個隱式聲明的常量字元數組實現的:

static const char __func__[] = "function-name";

在function-name處,為實際的函數名。為激活此特性,某些編譯器需要使用特定的編譯標志,請查看相應的編譯器文檔,以獲取具體的資料。

有了它,我們可免去大多數通過手工修改,來顯示函數名的苦差事,以上的例子可如下所示進行重寫:

void myfunc()
{
cout<<"__FUNCTION__"<<endl;
}

官方C99標准為此目的定義的__func__標識符,確實值得大家關注,然而,ISO C++卻不完全支持所有的C99擴展,因此,大多數的編譯器提供商都使用 __FUNCTION__ 取而代之,而 __FUNCTION__ 通常是一個定義為 __func__ 的宏,之所以使用這個名字,是因為它已受到了大多數的廣泛支持。

在Visual Studio 2005中,默認情況下,此特性是激活的,但不能與/EP和/P編譯選項同時使用。請注意在IDE環境中,不能識別__func__ ,而要用__FUNCTION__ 代替。

Comeau的用戶也應使用 __FUNCTION__ ,而不是 __func__ 。

C++ BuilderX的用戶則應使用稍稍不同的名字:__FUNC__ 。

GCC 3.0及更高的版本同時支持 __func__ 和__FUNCTION__ 。

一旦可自動獲取當前函數名,你可以定義一個如下所示顯示任何函數名的函數:

void show_name(const char * name)
{
cout<<name<<endl;
}

void myfunc()
{
show_name(__FUNCTION__); //輸出:myfunc
}

void foo()
{
show_name(__FUNCTION__); //輸出:foo
}

因為 __FUNCTION__ 會在函數大括弧開始之後就立即初始化,所以,foo()及myfunc()函數可在參數列表中安全地使用它,而不用擔心重載。

簽名與修飾名

__FUNCTION__ 特性最初是為C語言設計的,然而,C++程序員也會經常需要有關他們函數的額外信息,在Visual Studio 2005中,還支持另外兩種非標準的擴展特性:__FUNCDNAME__ 與 __FUNCSIG__ ,其分別轉譯為一個函數的修飾名與簽名。函數的修飾名非常有用,例如,在你想要檢查兩個編譯器是否共享同樣的ABI時,就可派得上用場,另外,它還能幫助你破解那些含義模糊的鏈接錯誤,甚至還可用它從一個DLL中調用另一個用C++鏈接的函數。在下例中,show_name()報告了函數的修飾名:

void myfunc()
{
show_name(__FUNCDNAME__); //輸出:?myfunc@@YAXXZ
}

一個函數的簽名由函數名、參數列表、返回類型、內含的命名空間組成。如果它是一個成員函數,它的類名和const/volatile限定符也將是簽名的一部分。以下的代碼演示了一個獨立的函數與一個const成員函數簽名間的不同之處,兩個函數的名稱、返回類型、參數完全相同:

void myfunc()
{
show_name(__FUNCSIG__); // void __cdecl myfunc(void)
}

struct S
{
void myfunc() const
{
show_name(__FUNCSIG__); //void __thiscall S::myfunc(void) const
}
};

⑵ c語言中函數名就是地址嗎

函數名在主函數里是個介面或者叫入口,你可以通過定義一個指針來指向他
void * p;
int fun(int a);
p=fun;

⑶ C語言主函數的函數名是什麼意思

1,先不用理解太多,只要知道main函數是程序入口地址,也就是說每次寫程序都得有一個main(),然後多多練習程序,有些概念時間久了自然會理解。多練習就好,只是每次寫程序都要有一個main(),這一點先記住就好。記住,要想學好,就得多練,多寫程序,剛開始不會寫,可以照抄程序,然後做少量修改,改著改著,你就明白程序怎麼寫了。
2,關於數學,英文或是其他學科。
其實c語言,也只是一種工具,一種和計算機打交道的工具。就想英語,漢語一樣。只是英語、漢語都是和人打交道的。而計算機聽不懂這些,你得用他能理解的語言來和他溝通,這就是計算機語言。這里邊是需要一點英文,但不多,我有一個沒學過英文的同學(他主修俄語),照樣程序寫的很好。數學嘛,這個就得看你的應用方向了。
參考資料:http://iask.sina.com.cn/b/18581538.html

C語言
按照C99標準的規定,C語言的main函數如下:
int main(
void){/*網路示例代碼*/}//整數類型主函數(無類型)

或者
int main(intargc,
char*argv[]){/*網路示例代碼*/}//整數類型主函數(整數類型統計參數個數,字元類型*
數組指針至字元[])

⑷ C語言中,函數名代表函數的入口地址嗎!!!求大神!求解析

「如果在程序中定義了一個函數,在編譯時會把函數的源代碼轉換為可執行代碼並分配一段存儲空間。這段內存空間有一個起始地址,也稱為函數的入口地址。函數名代表函數的起始地址。調用函數時,從函數名得到函數的起始地址,並執行函數代碼。」摘自《C程序設計(第五版)》-譚浩強,P265頁。

⑸ [ c語言函數名作為入口地址但是調用函數時只需要函數名+形參但定義指向函數的指針時需*(指針變數)

C語言中,所有的變數都存儲在內存中,可以通過&運算符獲得變數的內存地址,函數調用時,只需要把普通變數前加上&符號,就可以達到傳遞變數地址的目的。例如:定義一個結構體類型structYearmonthday{intyear,month,day;};定義相關函數

⑹ 用C語言編程,入口點為什麼一定是 main() 函數啊不可以自定義嗎怎麼更改它

其實入口函數是可以修改的 但是需要在預編譯時修改 添加如下預編譯命令就可做到:
#pragma comment(linker, "/entry:function");

把function改成你想要的函數名就可以

⑺ C語言中入口參數是什麼

以下以 C 語言為例,其餘語言與之有類似之處:

A function is uniquely represented by a name and a set of operand types.
Its operands, referred to as parameters, are specified in a
comma-separated list enclosed in parentheses. The actions that the
function performs are specified in a block, referred to as the function
body. Every function has an associated return type.

函數由函數名以及一組操作數類型唯一地表示。函數的操作數,也即形參,在一對圓括弧中聲明,形參與形參之間以逗號分隔。函數執行的運算在一個稱為函數體的塊語句中定義。每一個函數都有一個相關聯的返回類型。

As an example, we could write the following function to find the greatest common divisor of two ints:

考慮下面的例子,這個函數用來求出兩個 int 型數的最大公約數:
// return the greatest common divisor

int gcd(int v1, int v2)

{

while (v2) {

int temp = v2;

v2 = v1 % v2;

v1 = temp;

}

return v1;

}

Here
we define a function named gcd that returns an int and has two int
parameters. To call gcd, we must supply two int values and we get an int
in return.

這里,定義了一個名為 gcd 的函數,該函數返回一個 int 型值,並帶有兩個 int 型形參。調用 gcd 函數時,必須提供兩個 int 型值傳遞給函數,然後將得到一個 int 型的返回值。

————C++ Primer 4th Edition

可以將形參理解為入口參數,返回值理解為出口參數
話說,現在應該基本上不使用「入口參數」/「出口參數」這樣的說法了吧

⑻ C語言中,函數名代表函數的入口地址嗎!!!求大神!求解析!

「如果在程序中定義了一個函數,在編譯時會把函數的源代碼轉換為可執行代碼並分配一段存儲空間。這段內存空間有一個起始地址,也稱為函數的入口地址函數名代表函數的起始地址。調用函數時,從函數名得到函數的起始地址,並執行函數代碼。摘自《C程序設計(第五版)》-譚浩強,P265頁。

⑼ C語言中的入口函數是具體參數是

1.
變數是存放在內存中的,只要是存放在內存中的二進制數就會有一個內存的地址,所有變數是有地址的!
2.
那函數是什麼呢?函數是由一些運行的語句組成的,程序運行的時候就會把函數中的語句調用到內存中去,那麼函數代碼在內存中開始的那個內存空間的地址就是函數的地址!
3.
至於函數中用的變數的地址並不是放在代碼區的,一般都放在另外的兩個地方,其實地址上是有很大的差值的
希望你能理解上面的內容,祝願你學習c語言能馬到成功!