C 语言里 , struct 里到底能不能写函数?

languagec 2008-06-25 07:28:15
我前段时间去面试,碰到这门个问题:
C语言里,结构体 struct 里,能不能写函数?

我当时最后回答不能,可是面试官告诉我 , 能!并建议我看什么代码之类,大概是linix 的源代码,当时没听清。

我很疑惑,我请问一下给位英雄好汉,到底可不可以。
这个问题有两种理解,
1. 是下面这种形式
struct A
{
void Fun()
{
}
};

2.是下面这种形式
struct A
{

int i;
for(i=0;i<10;i++);

};

不知道有没有其他形式的理解。

不管是哪种,谁能实现其中一种? 或者,有什么证据证明可以或不可以?
...全文
2745 63 打赏 收藏 转发到动态 举报
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyue_2008 2011-07-06
  • 打赏
  • 举报
回复
不可以...
分析如下:
是存储空间的问题,你能想到如何分配存储空间么,分配多大?在c里结构体成员是可以指针访问的,
如果有函数,岂不是指针跑到代码段去了?如何跑回来,哪位面试官解释一下...

  • 打赏
  • 举报
回复
学习了……
FindFullMoon 2008-07-01
  • 打赏
  • 举报
回复
这样组织代码好像蛮好玩的。。
zhangjundriver 2008-06-27
  • 打赏
  • 举报
回复
在纯c当中struct就是个结构体,不可以定义函数,如果定义一个函数的指针,那也是一个数据成员,不是函数
也就是说在c中struct 只能包含数据成员;
这和C++里面的struct是两个完全不同的概念,因为struct和class有基本上是同样的作用,都可以拿来定义一个类,只是默认的访问限制:struct为public 而 class为 private,这就是他们的区别,其它的都一样

所以在c中的struct和c++的struct是不同的,有区别的,这是小弟的一点见解,不知道对不对!
program2050 2008-06-27
  • 打赏
  • 举报
回复
哇,又长见识了。函数指针。
但是为什么要这么麻烦呢。想写函数,直接编一个类不就可以了吗?
wargrey 2008-06-27
  • 打赏
  • 举报
回复
以前我曾考虑过一个问题,就是用c来写面向对象的程序,主要原理是结合函数指针和struct的内存分布。
但是直接写函数是不行的。
也许面试官说得是Object-c,这时Mac OS X的标准开发语言,Linux里面也有。估计它的struct能写函数。

Fuck这类面试题,你也可以问问你的面试官“C++或C#的struct里可不可以不写函数”
ww2734 2008-06-27
  • 打赏
  • 举报
回复
在C中绝对不能有函数,c++可以,这是c与c++的区别
Conry 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 icoding 的回复:]
引用 47 楼 LoocalVinci 的回复:
C是不行的,C要求相对严格,这样可以缓解编译器的压力,也给程序员更多的自由。
楼主可以考虑用函数指针来使用call back function,这是C语言里比较常用的方式。其实资深的程序员完全可以用struct,指针和少量的union构建出自己的OOA!


你写个我看看呢
[/Quote]

早期的c++编译器先把c++代码翻译成c代码,然后再用c编译器编译的
kill219111 2008-06-27
  • 打赏
  • 举报
回复
C是不行的,只能用函数指针成员
就呆在云上 2008-06-27
  • 打赏
  • 举报
回复
如果是c语言个人经验只能直接用函数指针,如果是c++可以直接定义函数的。
如果你看过内核源代码就应该有点印象,没有的话也应该看看
先引用人家的c代码:
#include <stdio.h>

#include <stdio.h>
void fun()
{
printf("hello,world\n");
}

struct test
{
void (*Fun)();
};

int main()
{
struct test t;
t.Fun = fun;

t.Fun(); //直接调用

return 0;
}


再给一个c++代码:
#include <iostream>
using namespace std;

typedef struct a {
void test() {}
} A;

int main(int argc, char* argv[])
{
A my_a;
my_a.test();
return 0;
}

gygl_4 2008-06-26
  • 打赏
  • 举报
回复

typedef int function(int a, int b);

typedef struct
{
function hi;
}TEMP_STRUCT;

....
hi(a,b);



zheyang?
Sco_field 2008-06-26
  • 打赏
  • 举报
回复
学习了,若是我的话,也会给出楼主一样的答案
太乙 2008-06-26
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 bellbird 的回复:]
面试题都很变态,曾经参加个笔试,问开始菜单的快捷键是什么,有alt+esc,ctrl+esc,shift+esc等等,当时还真的不知道
[/Quote]

汗~!~~~~~~~~


ctrl+esc~!
嘿嘿~~


学习了!!
bellbird 2008-06-26
  • 打赏
  • 举报
回复
面试题都很变态,曾经参加个笔试,问开始菜单的快捷键是什么,有alt+esc,ctrl+esc,shift+esc等等,当时还真的不知道
codeangel 2008-06-26
  • 打赏
  • 举报
回复
??
night_legend 2008-06-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 fly4free 的回复:]
11楼,你给的地址怎么不好使?
[/Quote]
codeangel 2008-06-26
  • 打赏
  • 举报
回复
C++里,struct 就好比是 class
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jixingzhong 的回复:]
函数指针方式实现,而不要直接定义函数 ...
[/Quote]
传说中的大侠终于出来了!~听大侠的……
lvxuef 2008-06-26
  • 打赏
  • 举报
回复
newlist002 2008-06-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 artman 的回复:]
函数指针呗.
[/Quote]
加载更多回复(43)
C 语言常见问题集 原著:Steve Summit 翻译:朱群英, 孙 云 修订版 0.9.4, 2005年6月23日 版权所有 © 2005 目录 1. 前言 2. 声明和初始化 2.1 我如何决定使用那种整数类型? 2.2 64 位机上的 64 位类型是什么样的? 2.3 怎样定义和声明全局变量和函数最好? 2.4 extern 在函数声明中是什么意思? 2.5 关键字 auto 到底有什么用途? 2.6 我似乎不能成功定义一个链表。我试过 typedef struct { char *item; NODEPTR next; } *NODEPTR; 但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗? 2.7 怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组? 2.8 函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。 2.9 main() 的正确定义是什么? void main() 正确吗? 2.10 对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为 ``零", 它可否作为空指针或浮点零? 2.11 代码 int f() { char a[] = "Hello, world!";} 不能编译。 2.12 这样的初始化有什么问题?char *p = malloc(10); 编译器提示 ``非法初始式" 云云。 2.13 以下的初始化有什么区别?char a[] = "string literal"; char *p = "string literal"; 当我向 p[i] 赋值的时候, 我的程序崩溃了。 2.14 我总算弄清除函数指针的声明方法了, 但怎样才能初始化呢? 3. 结构、联合和枚举 3.1 声明 struct x1 { ...}; 和 typedef struct { ...} x2; 有什么不同? 3.2 为什么 struct x { ...}; x thestruct; 不对? 3.3 一个结构可以包含指向自己的指针吗? 3.4 在 C 语言中实现抽象数据类型什么方法最好? 3.5 在 C 中是否有模拟继承等面向对象程序设计特性的好方法? 3.6 我遇到这样声明结构的代码: struct name { int namelen; char namestr[1];}; 然后又使用一些内存分配技巧使 namestr 数组用起来好像有多个元素。这样合法和可移植吗? 3.7 是否有自动比较结构的方法? 3.8 如何向接受结构参数的函数传入常数值? 3.9 怎样从/向数据文件读/结构? 3.10 我的编译器在结构中留下了空洞, 这导致空间浪费而且无法与外部数据文件进行 "二进制" 读。能否关掉填充, 或者控制结构域的对齐方式? 3.11 为什么 sizeof 返回的值大于结构的期望值, 是不是尾部有填充? 3.12 如何确定域在结构中的字节偏移? 3.13 怎样在运行时用名字访问结构中的域? 3.14 程序运行正确, 但退出时却 ``core dump''了,怎么回事? 3.15 可以初始化一个联合吗? 3.16 枚举和一组预处理的 #define 有什么不同? 3.17 有什么容易的显示枚举值符号的方法?

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧