是否有可能在C中定義依賴於數據類型的函數。我想定義一個函數,它根據1d數組或2d數組作爲參數使用不同的過程。功能取決於C中的數據類型
回答
這些天最簡單的方法是使用一個宏_Generic
。以下是一個展示如何使用它的例子。
#define cbrt(X) _Generic((X), \
long double: cbrtl, \
default: cbrt, \
float: cbrtf \
)(X)
因此,根據不同的類型,這個宏將本着以cbrtl()
一個,cbrtf()
,或cbrt()
一個電話所取代。
我一直忘記'_Generic',它是完全標準的C99;可能是因爲它的恐怖導致記憶細胞死亡。但它非常有用,絕對值得了解。 (雖然也值得指出它不在C++中,並且微軟的編譯器不會做C99。) – 2015-02-24 19:18:42
@DavidGiven:如果我們編寫C++代碼,那麼這整個討論是沒有意義的。真正的模板存在於C++中。 – 2015-02-24 19:19:32
這是C11而不是C99。 – mfuchs 2015-02-24 19:21:48
函數重載是不可能的C.
你仍然可以實現這樣的事情,雖然使用作爲概括here變量類型。 雖然它可以很快凌亂。 所以你可能會更好地實施兩個功能。
不是(至少不是沒有_Generic
shennanigans)。這是爲什麼。
考慮下面的代碼:
int a(int b[][]) {
return 0;
}
int a(int b[]) {
return 0;
}
int main (int argc, char *argv[])
{
int c = 5;
a(c);
return 0;
}
現在考慮編譯器的輸出(在這種情況下gcc
):
a.c:1:11: error: array type has incomplete element type
int a(int b[][]) {
^
a.c:5:5: error: redefinition of ‘a’
int a(int b[]) {
^
a.c:1:5: note: previous definition of ‘a’ was here
int a(int b[][]) {
^
a.c: In function ‘main’:
a.c:12:5: warning: passing argument 1 of ‘a’ makes pointer from integer without a cast [enabled by default]
a(c);
^
a.c:5:5: note: expected ‘int *’ but argument is of type ‘int’
int a(int b[]) {
^
在該示例中,第一a()
函數採用一個二維數組(技術上是雙指針),第二個a()
採用一維數組。
首先,編譯器不會允許它。
二,如果我將一個整數傳遞給函數呢?編譯器打印一個警告,但讓它發生並將整數轉換爲一個指針(一維數組),但它無法分辨是將它轉換爲單個指針(單維數組)還是雙指針(二維數組)。
- 1. 功能與數據類型
- 2. C近拍取決於類型
- 3. scala:mixins取決於參數的類型
- 4. 所有類型參數取決於彼此的功能依賴關係
- 5. 數據結構的功能類似於C或C++中的數據庫
- 6. Makefile的C/C++與功能取決於環境
- 7. 呼籲取決於類型
- 8. 動態結合功能取決於在C++參數
- 9. 取決於模板參數的C++模板返回類型?
- 10. 宏返回類型取決於參數
- 11. 值的範圍取決於數據類型的大小?
- 12. 功能的數據類型是SML
- 13. PowerShell的功能限制數據類型
- 14. 取決於'If'功能的按鈕
- 15. WPF DataGrid Cell的條件格式取決於數據類型
- 16. 應用if else條件取決於返回的數據類型
- 17. 取決於數據類型的格式輸出字符串
- 18. C#中的依賴類型:使輸出類型取決於輸入值
- 19. 的Objective-C C類型及功能
- 20. Casting void指針,取決於數據(C++)
- 21. C#相當於C++/CLI數據類型
- 22. ML - 數據類型和功能
- 23. 導航到數據類型或功能
- 24. C中的數據類型
- 25. 關於C#數據類型的問題
- 26. 輸入字段格式數據不同 - 取決於輸入的數據類型
- 27. 上調用A類的方法取決於類型參數的
- 28. 代數數據類型相當於C
- 29. in spring mvc fm,我怎樣才能決定返回類型取決於參數?
- 30. 如何調用vimrc中的函數取決於文件類型
使用兩個功能? – isedev 2015-02-24 19:10:36
特別是,從這個問題[這個答案](http://stackoverflow.com/a/25026358/47453)。 – 2015-02-24 19:12:44