㈠ 編寫一個c語言程序要求找出原函數中的函數名
#include
#define
pi
3.14159double
square(double
r){
return
pi
*
r
*
r;}double
perimeter(double
r){
return
2
*
pi
*
r;}int
main(){
double
r;
printf("請輸入圓的半徑:\n");
while(scanf("%lf",&r)!=
eof){
printf("圓的面積是%lf\n",square(r));
printf("圓的周長是%lf\n",perimeter(r));
printf("請輸入圓的半徑:\n");
}
return
0;}運行結果:請輸入圓的半徑:1圓的面積是3.141590圓的周長是6.283180請輸入圓的半徑:2
圓的面積是12.566360圓的周長是12.566360請輸入圓的半徑:
㈡ C語言getchar()詳細介紹
函數名: getchar
功 能: 從stdin流中讀字元
用 法: int getchar(void);
getchar()函數從STDIN(標准輸入)獲取並返回下一個字元,如果到達文件尾返回EOF。
程序例:
#include <stdio.h>
int main(void) {
int c;
/*
Note that getchar reads from stdin and is line buffered;
this means it will not return until you press ENTER.
*/
while ((c = getchar()) != '\n')
printf("%c", c);
return 0;
}
㈢ c語言 如何獲取當前函數的上層函數名,即調用他的函數
在c語言編程中想得到系統的當前時間,記得前面應該包含time.h的頭文件,但是不知道具體使用什麼函數?還有就是怎麼實現日期的相減,用舊的時間和當前的時間得到差值就是相差的天數?在c中沒有日期類型,日期是不是應該存放在字元數組中以字元串的形式存在,這樣相減的時候如果用atoi函數轉化為整形進行計算還是不能解決問題啊?有哪位知道請幫下忙?謝謝啦!
㈣ 在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語言,怎麼在函數內調用自身函數名字元串
錯誤提示在_func_應該是兩個_,改成如下:
__func__
㈥ C語言如何獲取一個函數的代碼和數據
為了提高代碼的可讀性,推薦都是多以函數實現功能。函數本身需要傳入返回數據,那麼aes加密函數就會把傳入的數據加密,然後通過返回值返回到變數裡面。我們假設aes函數名字叫aes,那麼我們就這樣調用:需要加密的數據是a。加密結果是result
int a = 000;
String result = aes(a);
result便是加密後的a
實際代碼會很復雜但是結構是這樣的。
㈦ 如何用perl提取c語言函數名
1、有些應用中perl的速度比較慢,但是如果和c結合起來,就可以解決這樣的問題了。
2、perl和c結合有三種辦法,第一是用c來寫xs製作perl模塊,再在perl代碼中載入,這個比較簡單,CU和IBM都有文檔看,我就不寫了。
2、在C中嵌入perl腳本,這個對我來說沒什麼用,我還沒看。
3、就是本文要說的,在Perl中嵌入C代碼了。實現起來簡單方便,唯一的要求是運行perl腳本的機器要有編譯器,VC和GCC都行。
㈧ c語言函數內部獲取調用該函數的函數名
獲取不到,函數名在連接時被替換成函數入口地址,實際運行的程序中通常不存在函數名(PE文件如果有函數導出表則導出表中可能會記錄函數名)。變數名同理。
㈨ C語言 Linux 獲取調用者函數名稱
可以做到的,參考一下backtrace_symbols的實現以及相關原理,這裡面比較復雜,也比較底層,一兩句話說不清楚
你要是想通過_FUNCTION_這種方式來搞的話,可以通過如下方式:
#define m_fun(args) fun(__FILE__,__LINE__, args)
進行相應的替換即可
㈩ C語言中有沒有像__FILE__一樣的一個"函數",可以取得這個語句當前所有的函數的名稱
就是__FILE__
類似的還有__LINE__
__func__
這3個特殊宏是C99裡面定義的