Python 在C中模拟命名参数的一种方法

Python 在C中模拟命名参数的一种方法,python,c,Python,C,有没有办法在C函数中使用命名参数 类似于prototypevoidfoo的函数(inta、intb、intc) 我想用foo(a=2,c=3,b=1)来调用它[替换了b&c的顺序,并使用其名称进行区分] 动机:我想要一个更具python风格的C,在这里我可以轻松地操作我的函数参数,而不会错误地混合它们C中不支持命名参数 所有参数必须以正确的顺序传递。有点,排序,带有复合文字和指定的初始值设定项: typedef struct foo_args { int a; int b; int

有没有办法在C函数中使用命名参数

类似于prototype
voidfoo的函数(inta、intb、intc)

我想用
foo(a=2,c=3,b=1)来调用它[替换了
b&c
的顺序,并使用其名称进行区分]


动机:我想要一个更具python风格的C,在这里我可以轻松地操作我的函数参数,而不会错误地混合它们

C中不支持命名参数


所有参数必须以正确的顺序传递。

有点,排序,带有复合文字和指定的初始值设定项:

typedef struct foo_args {
  int a;
  int b;
  int c;
} foo_args;

// Later

foo(&(foo_args) {
  .a = 2,
  .c = 3,
  .b = 1
});

但我真的不想麻烦。它要求您弯曲函数定义以接受指针,这使得调用它变得很麻烦。

为什么要这样做?如果您有这些值,为什么需要更改顺序?很简单。我有一个可以很容易地混合参数的函数,我想帮助用户避免混淆。我也不太确定这是否会有帮助,用户不需要看到函数调用,C开发人员对固定序列也很满意。我不相信改变任何事情都会有用。@CIsForCookies不,它不是。编写调用函数的代码时,将函数声明放在面前。此外,现在大多数IDE:s都有代码补全功能,这意味着当您开始键入函数调用时,您也会得到信息。如果这对程序员来说太难了,那么也许他们应该考虑一个不同的职业。你可以把函数定义为<代码> int MyFunc(int ARC,char *ARGV){…}/<代码>,并使用GETopt()来进行解析。但我担心这不会让你成为朋友…@CIsForCookies-我把它画得很糟糕是有原因的;)在我看来,与python相比,C的优势之一是不能更改函数参数的顺序或类型。这样,编译器就可以处理许多在python中可能是语义错误的错误。不要试图在C语言中模仿python,而是重新思考您的体系结构。@wolff umm。。。不需要。在Python中,您不必记住参数顺序——在C中,您必须记住。@wolff。同意,但为了在这里扮演魔鬼代言人的角色,显式命名参数是一种避免由于具有相同类型的多个位置参数而产生语义错误的方法。@MadPhysicast-公平地说,相同类型的多个位置参数有点代码味道。特别是如果电话太多,打电话的人很难跟踪。我可能会建议将参数聚合到一个结构中以避免这种情况。