2016-04-09 32 views
4

我一直在想很多关于最简单的方式来最低限度地表达C中的主要功能(是的,它是微不足道的,通常不感兴趣,但这对我很有意思)。是否有任何问题与主要定义为int main(...){}

很长一段时间,为了这一天,我喜欢定义主要如下:

int main(int argc, char **argv) 
{ 
    return 0; 
} 

我对这个问题,我通常不会使用这些参数,所以它使论点明确,即使我在代码中不要太在意他们写出来。

于是我开始做

int main() 
{ 
    return 0; 
} 

这是诚实的,因为它没有明确地说,函数没有参数,如许多int main(void){}定义做了,我很满意。

但是,我只是有一个想法,使用主的可变参数定义使得主的定义对我来说更加舒适,因为它“看起来”对我来说好像函数确实有参数,但我不关心它们是正确的现在。

int main(...) 
{ 
    return 0; 
} 

这样滥用符号...有什么问题吗?也就是说,......意味着用于模式的函数(可以推导出以下参数的个数的参数,...)。而这个主要不适合这种模式,并在技术上是滥用符号。

我理解符号会误导其他读者(...有些先进的概念,并且被滥用会使其更具误导性),并且在共享代码时我仍然更喜欢其他原型。我只是很好奇C是否有效。

我的问题是:

  1. 主要是便携式的可变参数的定义或者是有可能,一些编译器会不喜欢它。

  2. 做这种定义通常是可以的,或者是这样做的运行时/编译时结果?

+7

对'(void)'和'(int,char **)'以外的签名的支持是由实现定义的,因此请咨询您的供应商。代码将不可移植。 –

+1

你尝试过'int main(...)'吗?如果你的编译器接受它是有效的,那么你使用的是什么编译器? – user3386109

+0

@ user3386109“g ++(Debian 4.7.2-5)4.7.2”和 “Debian clang version 3.0-6.2(tags/RELEASE_30/final)(based on LLVM 3.0)” – Dmitry

回答

4

不,那就是绝对是不对。

这是错误的,因为它是无效的语法。从n1548节6.7.6:

parameter-type-list: 
    parameter-list 
    parameter-list , ... 
parameter-list: 
    parameter-declaration 
    parameter-list , parameter-declaration 

按照C标准,如果你在函数参数使用...,你必须收到至少一个其他参数。其他都是无效的C.你可以从语法中看到...只能出现在逗号,参数列表参数列表不能为空。

您的编译器可能会接受它,但这并不意味着太多。编译器接受很多C无效的东西,并且很乐意编译它们。

+1

我撒谎,我的例子实际上并没有编译为C,而是C++。正如你所说的那样,它是无效的C语法,并且产生一个错误:ISO C在'...'前需要一个命名参数。当使用.cpp扩展名进行编译时,不会出现这种情况,我之所以这样做是出于实验原因。 – Dmitry

1

你的前两个版本都很好。使用符合您需求的任何一种。

int main(...)对这个函数不会有很好的签名,虽然它是有效的!

...表示该函数接受可变数量的未指定类型的参数。以printf()为例。它接受一个格式字符串之后的任何类型的零个或多个参数,其功能签名反映了这一点:

int printf(const char* format, ...) 

main功能是不是这样的。它接收特定类型的参数的特定列表,而不是具有必须在运行时确定的类型的可变数目的参数。

传统,main了在你的第一个例子中所示的两个参数:

int main(int argc, char **argv) 

当然,你可以通过不使用它们忽略这些参数,或者通过定义主要在你的第二个例子:int main()

取决于编译器/运行时,main可能需要第三个参数包含环境变量:

int main(int argc, char *argv[], char *env[]) 

它甚至可能需要第四个参数上OSX:

int main(int argc, char **argv, char **envp, char **apple) 

但在所有这些案件,你有特定类型的具体论点。 main不像printf - 它永远不会需要一个真正的变量不确定类型的参数数量。所以main(...)不是一个合适的签名。

+0

这不完全正确。 C的不同实现应该有额外的env参数。它需要有前两个参数(双字,指针)。 – Dmitry

+1

此外,如果该函数没有至少一个命名参数,则不能使用可变参数。 –

+0

@KerrekSB我在我的OP中提到过这个。这就是为什么我问,这是一个滥用符号,只是一个引人注目的。滥用符号如果它是一致的和理解的,我们一直这样做是可以的。问题在于,除了让人困惑之外,这种做法是否存在固有的不可移植/进一步的后果(这并不好,所以我仍然不会以这种形式向其他人展示)。 – Dmitry

相关问题