2014-12-04 69 views
0

在Python:如何讓一個函數的範圍在C中沒有嵌套函數?

#!/usr/bin/python 

def f1(a, b, c, d): 
    return a + b + c + d 

x = 5; 
y = 6; 
z = 7; 

fm = lambda m: f1(m,x,y,z) 
print fm(4) 

在Matlab中:

function [retval] = f1(a, b, c, d) 
    retval = a + b + c + d; 

x = 5; 
y = 6; 
z = 7; 

fm = @(m) f1(m,x,y,z); 
fm(4) 

我知道有C中沒有嵌套函數,而無需使用GCC擴展。我如何在C中獲得與使用嵌套函數相同的功能?我如何聲明變量並將它們用作另一個函數中的常量,如示例中所示?

+0

通過聲明它們爲全局靜態變量?或者通過傳遞他們作爲參數。 – 2014-12-04 19:43:54

+0

我認爲全局變量很糟糕。它會工作,但它真的是最好的方法嗎? – user1801359 2014-12-04 19:50:28

+0

如果你的程序由模塊組成,把你以前嵌套的函數放在一個模塊中,並使用共享變量的靜態聲明,將會阻止它們變成你的代碼的其他部分。 – 2014-12-04 19:54:36

回答

-1

您可以用預處理宏做到這一點:

#include <stdio.h> 

// Global variables? 
int x = 5, y= 6, z = 7; 

int f1(int a, int b, int c, int d) 
{ 
    return a + b + c + d; 
} 

#define fm(m) f1((m), x, y, z) 

int main() 
{ 
    fprintf(stdout, "%d\n", f1(4, x, y, z)); 
    fprintf(stdout, "%d\n", fm(4)); 
} 

或者,如果你可以使用C++:

#include <iostream> 

// Global variables? 
int x = 5, y= 6, z = 7; 

int f1(int a, int b, int c, int d) 
{ 
    return a + b + c + d; 
} 

// Alternative is using default arguments (much cleaner too) 
int easy(int a, int b = 5, int c = 6, int d = 7) 
{ 
    return a + b + c + d; 
} 

int main() 
{ 
    std::cout << f1(4, x, y, z) << std::endl; 
    auto fm = [](int m)->int { return f1(m, x, y, z); }; // Use lambda function 
    std::cout << fm(4) << std::endl; 
    std::cout << easy(4) << std::endl; 
} 
+0

C++?該標籤是C. – 2014-12-04 19:49:47

+0

我需要C中的解決方案,而不是C++。 lambda函數不在C中,對嗎? – user1801359 2014-12-04 19:49:56

+0

@GeorgeHoupis:c!= C++ – 2014-12-04 19:51:16

1

有沒有像你的Python例如「嵌套函數」 - 只有一個匿名函數,它可以被一個名字所取代。 FWIW你的Python代碼片段很容易在C中重寫:

# include <stdio.h> 

int f1(int a, int b, int c, int d) { 
    return a + b + c + d; 
} 

int x = 5; 
int y = 6; 
int z = 7; 

int fm(int m) { 
    return f1(m, x, y, z); 
} 

int main(int argc, char **argv) { 
    printf("%d\n", fm(4)); 
    return 0; 
} 
+0

包括這個答案在內的所有答案都使用全局變量。這種情況下解決方案是使用它們嗎? – user1801359 2014-12-04 20:21:35

+0

@ user1801359:你的Python代碼片段也使用全局變量。好吧,Python的「全局」變量實際上是「模塊全局變量」,但在上面的代碼中,它沒有任何區別。正如我評論的那樣:你的_real_問題是什麼? – 2014-12-04 20:26:17