你不能,但你可以通過追加()
的指針調用該函數。對於這項工作,改變你的函數實際上返回const char *
(或char *
)
注意你不能只返回一個指針到您buffer
,因爲這是一個局部變量不再存在時,函數返回。您可以從函數外部傳遞指向buffer
的指針。然後,您的原型應該是
char *time_stamp(char *buf, size_t len);
修改後的代碼:
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
char *time_stamp(char *buf, size_t len){
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buf,len,"myFile_%F.txt",timeinfo);
return buf;
}
int main()
{
char *(*filename_ptr)(char *, size_t);
filename_ptr = &time_stamp;
char buffer[80];
FILE * fp;
fp = fopen (filename_ptr(buffer, 80), "w+");
fprintf(fp, "%s %s %s %d", "We", "are", "in", 2017);
fclose(fp);
return 0;
}
有其他方法如何設計這個功能。 Neroku當你確定你永遠不需要線程上下文中的函數時,答案是很好的。它簡化了使用,甚至還有一些標準的C庫函數。
第三種方法是通過從malloc()
中獲取它來使緩衝區成爲分配的對象。這具有線程安全並且不需要任何額外參數的優點,函數本身像在原始的破碎版本中一樣控制緩衝區的大小。缺點是調用者必須使用free()
這個內存。這個示例代碼(我這裏不推薦的):
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
char *time_stamp(){
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
char *buf = malloc(80);
strftime (buf,80,"myFile_%F.txt",timeinfo);
return buf;
}
int main()
{
char *(*filename_ptr)();
filename_ptr = &time_stamp;
FILE * fp;
char *filename = filename_ptr();
fp = fopen (filename, "w+");
free(filename);
fprintf(fp, "%s %s %s %d", "We", "are", "in", 2017);
fclose(fp);
return 0;
}
你期望fopen如何處理函數指針? – Yunnosch
這是因爲你的CPU沒有DWIM(我的意思是什麼)指令。在此之前,你需要實際告訴計算機該做什麼,因爲它無法讀懂你的想法。 – Art
查看您的手冊或手冊頁,瞭解fopen的原型。這是你需要履行的合同。這些是你必須遵守的規則。如果有一個'const char *'作爲第一個參數,那麼你不應該傳入一些奇怪的奇特函數指針。 – Gerhardh