免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: co63
打印 上一主题 下一主题

[C] c语言中函数最长可以是多长? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-10-17 21:56 |只看该作者
原帖由 co63 于 2008-10-17 17:31 发表

这种想法不对
你看上面,还没有人能说出准确的答案



许三多说:好好活就是做有意义的事

你还是好好活着,多做点有意义的事吧

论坛徽章:
0
12 [报告]
发表于 2008-10-19 11:26 |只看该作者
你想把编译器逼疯?

论坛徽章:
0
13 [报告]
发表于 2008-10-20 16:06 |只看该作者
原帖由 j1111011 于 2008-10-17 17:47 发表

#include
#include
#include
using namespace std;
int main(int argc,char **argv){
    if(argc==1)
        return 0;
 & ...

看来 windows 下有限制
我在linux下测试的。


用C写了程序,参数是函数名长度,用gcc编译。
在CentOS5.2上测试时,参数用了很大的值,源文件大小到了100M时,也没看到问题。
看来不同编译器结果不同。
应该没必要在长度上考虑了,gcc可能使用了什么其他技术。
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char **argv)
{
&nbsp;&nbsp;&nbsp;&nbsp;long i;
&nbsp;&nbsp;&nbsp;&nbsp;int j = 0;
&nbsp;&nbsp;&nbsp;&nbsp;char func_name[100] = {0};
&nbsp;&nbsp;&nbsp;&nbsp;char file_a[100] = {0};
&nbsp;&nbsp;&nbsp;&nbsp;char file_b[100] = {0};
&nbsp;&nbsp;&nbsp;&nbsp;FILE *fp_a, *fp_b;
&nbsp;&nbsp;&nbsp;&nbsp;char *buf;
&nbsp;&nbsp;&nbsp;&nbsp;char *content;
&nbsp;&nbsp;&nbsp;&nbsp;char cmd[100];

&nbsp;&nbsp;&nbsp;&nbsp;if (argc == 1)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("usage: %s [length]\n", argv[0]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;i = atol(argv[1]);
&nbsp;&nbsp;&nbsp;&nbsp;printf("length is %d\n", i);

&nbsp;&nbsp;&nbsp;&nbsp;buf = malloc(i + 1000);
&nbsp;&nbsp;&nbsp;&nbsp;content = malloc(i + 1000);

&nbsp;&nbsp;&nbsp;&nbsp;for (; i<=i; i+=100)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(func_name, "%d", i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(file_a, "a%s.c", func_name);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(file_b, "b%s.c", func_name);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fp_a = fopen(file_a, "w");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fp_b = fopen(file_b, "w");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(buf, 0, i + 1000);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (j = 0; j < i; j ++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[j] = 'a';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(content, "\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void %s () {\n\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"hello from func.\\n\");\n\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n"
,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(content, strlen(content), 1, fp_a);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(content, "\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include <stdlib.h>\n\n\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int main() {\n\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%s();\n\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"hello from main.\\n\");\n\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;\n\
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n"
,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(content, strlen(content), 1, fp_b);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp_a);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp_b);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;sprintf(cmd, "gcc %s %s -o %d", file_a, file_b, i);
&nbsp;&nbsp;&nbsp;&nbsp;system(cmd);

&nbsp;&nbsp;&nbsp;&nbsp;free(buf);
&nbsp;&nbsp;&nbsp;&nbsp;free(content);

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
14 [报告]
发表于 2008-10-20 16:07 |只看该作者
就是觉得gcc很厉害

论坛徽章:
0
15 [报告]
发表于 2008-10-20 16:13 |只看该作者
原帖由 co63 于 2008-10-17 17:31 发表

这种想法不对
你看上面,还没有人能说出准确的答案

就是因为这个问题太无聊了,才没人能给出准确答案。
知道了又怎样?有意义么

论坛徽章:
0
16 [报告]
发表于 2008-10-20 17:22 |只看该作者
原帖由 redspider 于 2008-10-20 16:13 发表

就是因为这个问题太无聊了,才没人能给出准确答案。
知道了又怎样?有意义么


觉得无聊的人不要再回复了

既然觉得无聊,又打开主题做什么呢


因为以前我也在书上看过,好像是有长度限制的
于是测试看看
书上的信息错了,这不是事情么?

不是一定要一个答案,只是给问题找到更多的信息。
或许以后还有别人对这个问题感兴趣了。

[ 本帖最后由 co63 于 2008-10-20 17:37 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-10-20 20:25 |只看该作者
这个应该跟编译器设置有关吧 还有与机器自身硬件有关吧 地址空间总是有限的

论坛徽章:
0
18 [报告]
发表于 2008-10-20 22:13 |只看该作者
怎么可能
字符串能做多长那么函数名就可以有多长
比如c++实现是这样的
在编译器里面,一个函数名被解析成为函数名加上参数的标识等等,那么编译器以字符串来表示,字符串可以有多长那么就是用多长的函数名,都要压入堆栈
如果出错就是堆栈溢出!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP