C_and_CPP 板


LINE

※ 引述《QQ29 (我爱阿蓉)》之铭言: : 标题: Re: [问题] extern "C"的问题 : 时间: Wed Jun 10 13:46:23 2009 : : 不好意思 我现在自己想问题测试 其实我对extern "C"真的不是很懂 : z大说的我明白 : 而我现在写法是这样如下 : : main.cpp : #include <iostream> : using namespace std; : #include "test.h" 先挑一个和标题无关的错误:using namespace 不应该写在任何 #include 之前 这算是满糟糕的写法,因为 compiler 不会报错, 只有在发生名称冲突时才吐一堆不知所云的讯息,而你不会想到是这行写错地方 : 以上这样写 是为了让 test.c不去include test.h(我那个struct .c必须用到) : 这样可以compile过 但是我继续想办法try : 我将extern "C"拿掉 test.c改成test.cpp : 竟然就认不到了........... 你的「认不到」是指 compiler error 还是 link error? 错误讯息是什麽? main.cpp: #include "test.h" int main() { foo(); return 0; } test.h: #ifndef TEST_H #define TEST_H struct FU; FU* foo(); #endif // TEST_H test.cpp typedef struct FF { int x, y; } FU; FU* foo() { return NULL; } 以上的 code 可以顺利 compile、link 并执行 但其中却隐含了非常邪恶的地方 那就是在 test.h 中并没有 typedef 的叙述 所以你在 test.cpp 中虽然使用了 typedef 但含入 test.h 的 main.cpp 中并不知道「FF」这个 struct 的存在 它得到的资讯仅是: foo() 是一个函式,不接受参数,传回一个指向 FU 的指标 而 test.cpp 呢?因为 typedef 的缘故,它知道 FU 只是 FF 的别名, 所以你定义的 foo() 是: foo() 是一个函式,不接受参数,传回一个指向 FF 的指标 所以你的定义和宣告已经如同政客般言行不一了 但运气很好 (从另一个角度来看,应该说不好才对) 的是 C++ 的函式回传型别并不会成为 name mangling 的一部份 所以上述的 foo() 虽然本质上是不同的 但它们在编译时会变成相同的 symbol 因此上述的程式可以顺利连结 如果你改成以下的写法,就过不了关了: test.h: #ifndef TEST_H #define TEST_H struct FU; void foo(FU*); #endif // TEST_H test.cpp typedef struct FF { int x, y; } FU; void foo(FU*) { return; } : 原因很想请板上高手解释一下 : : 因为我知道struct改成class的话 上面的改法 就不会有问题 C++ 中 struct 和 class 几乎完全相同, 唯一的不同在於 struct 预设成员为 public 而 class 预设成员为 private 其它使用方法完全相同 : 1.为什麽struct却不能呢? 因为你用了 typedef : 2.一开始我这样故意把.c的include .h拿掉是不是一个好的作法? 不是 因为你的 .c 明显是要实作 .h 提供的介面 不去 include 是自找麻烦 : 不然势必extern "C"就要写在main ==>extern "C"{include "test.h"} 一般会这样写: #ifndef TEST_H #define TEST_H #ifdef __cplusplus extern "C" { #endif // __cplusplus typedef struct FF { int x, y; } FF; FF* foo(void); #ifdef __cplusplus } // end of extern "C" #endif // __cplusplus #endif // TEST_H 这样你的 test.h 就能让 C/C++ compiler 同时使用 : → QQ29:你好~typedef我认知是 定义struct并且给一个(以上)别名之类的 06/10 14:04 : → QQ29:我是不清楚 看很多他人写的程式都很爱使用typedef struct 06/10 14:05 : → QQ29:但是实际上的好处以及在我问的问题上 差异在哪里!! 06/10 14:05 C 里面的 struct 名称不能直接当型别使用,需要在前面多加 struct 关键字: struct Point { int x, y; }; void foo() { Point p; // error struct Point p; // OK } 所以很多人会这样写: typedef struct Point { int x, y; } Point; void foo() { Point p; // OK } 但是 C++ 已经没有这层限制了: struct Point { int x, y; }; class Line { Point start, end; }; void foo() { Point p; // OK Line l; // OK } 大大您也是 C_and_CPP 的常客了,也该积极了解自己写出每行 code 的真正意义。 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.87.151.2
1F:推 QQ29:谢谢你 我会仔细研究一下 我很积极只是自己功力不够@@ 06/10 15:02
2F:→ QQ29:还是感谢你 thx 06/10 15:02
3F:推 ledia:推 littleshan 的详尽解说 06/10 15:09
4F:推 QQ29:以上的 code 可以顺利 compile、link 并执行<<<上面这边我用 06/10 15:22
5F:→ QQ29:VC的话 他link不到耶 所以我说他认不到... 06/10 15:22
6F:推 dreamboat66:请问文中的__cplusplus是要在哪里define呢? 06/10 15:37
7F:推 VictorTom:推l大的解释:) 06/10 15:38
8F:推 Ebergies:__cplusplus compiler 会自己定义 06/10 15:40
9F:推 zlw:原来是不能直接用struct的型别名称,而不是不能struct s1{;}; 06/10 15:56
10F:→ zlw:我以前是看google搜寻到的文件,解释有误,难怪有经验的前辈 06/10 15:57
11F:→ zlw:都说不先看官方manual却反而去google,这是舍本逐末的作法 06/10 15:57
12F:推 QQ29:是因为compiler会最优先定义__cplusplus所以ifdef才会成立嘛 06/10 16:19
13F:→ QQ29:感觉是compile会在每个cpp最前面加上去define __cplusplus? 06/10 16:19







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP