1.#include <stdio.h>
2.怎样写一个输出自己源代码的码移程序?
3.为什么两个c源程序都包含stdio.h。 而链接时不会出现重定义,码移stdio里不是码移定义了许多函数ma?
4.# include <iostream> using namespace std; int main( ) { cout<<"this is a C++ program."; return 0; }
5.移植性和跨平台有什么区别?
#include <stdio.h>
å°±æ¯å
åªéæé®é¢å¢åï¼
第ä¸ä¸ªç»ææ¯
-
第äºä¸ªç»ææ¯
dog-is-clever
ä½æ¯æ¯ä¸ªæºä»£ç éçç»å°¾é½å°äºä¸ä¸ª"}"
é®é¢åè¡¥å äºåï¼ï¼ç¬¬ä¸ä¸ª
è¿ä¸ªä¼æ¥éçï¼ä¸»è¦æ¯z = (a + b + c â x - y) * 2;
å¯è½æ¯å ¨è§è¾å ¥çåå·ï¼æ¹ä¸ä¸å°±è¡äºå
ç»æ
çæ¯çåï¼æä¹èæ¯è¡¥å å
èªå·±è¿è¡ä¸ä¸ å¤å¥½å
è½å¤èªå·±å¾åºç»æå¦æ è¿è¡è¿ç¨ä¸ æ¥é就认ççæ¹ä¸ä¸å°±è¡äºå
åµåµ
ç¥ä½ 好è¿
怎样写一个输出自己源代码的程序?
要写一个可移植的自我再生的程序是件很困难的事, 部分原因是因为引用和字符集的难度。
这里是码移flask抖音源码个经典的例子 (应该以一行表示的, 虽然第一次执行后它后自我修复):
char*s="char*s=%c%s%c;main(){ printf(s,,s,);}";
main(){ printf(s,,s,);}
这段程序有一些依赖, 忽略了 #include <stdio.h>, 还假设了双引号 " 的值为 , 和 ASCII 中的值一样。
这里还有一个有 James Hu 发布的码移改进版:
#define q(k)main(){ return!puts(#k"\nq("#k")");}
q(#define q(k)main(){ return!puts(#k"\nq("#k")");})
为什么两个c源程序都包含stdio.h。 而链接时不会出现重定义,码移stdio里不是码移定义了许多函数ma?
1、如果引用了多次,码移会导致重复定义函数错误,码移所以多次导入需要做如下处理。码移
2、码移mid指标源码采用#ifndef避免重复导入。码移
格式如下:
#ifndef __SOMEFILE _H_
#define __SOMEFILE _H_
...//一些声明语句
#endif
#ifdndef的码移方式依赖于宏名不允许冲突。这不光可以保证同一个文件不会被包含多次,码移也能保证内容完全相同的码移两个文件不会不小心被同时包含。缺点是随心辅助源码如果不同头文件的宏名不小心相同,那么可能会导致头文件明明被include了,编译器却说找不到声明的状况。
3、你说多次导入没问题,那应该是slim框架源码用了2的方法
# include <iostream> using namespace std; int main( ) { cout<<"this is a C++ program."; return 0; }
第ä¸å¥æ¯å®ï¼ä¸æ¯C++è¯å¥ï¼æ以ä¸ä»¥å°å®åâè¦æ§è¡çâè¯å¥æ¾å¨ä¸èµ·ãæ以ï¼åªè½åæï¼
#include <iostream>
using namespace std; int main() { cout << "this is a C++ program."; return 0; }
å¨ç¼è¯ç³»ç»éï¼å®æ¯é¦å 被å®å¤çå¨å¤çï¼å¾å°å®æ´çC++æºä»£ç æ件ï¼ç¶ååç±ç¼è¯å¨å¤çâ¦â¦ã
æ以ï¼é¤äºå®æå¿ é¡»çé¨åï¼C++代ç ä¸è½å¾å®å¨åä¸è¡ã
æçæ¶åï¼ä½ ç¨Unixç³»åçæä½ç³»ç»ç¼è¾å¨ç¼åäºä¸ä¸ªä»£ç æ件ï¼è¿ä¸ªç¨åºå¯ä»¥ç§»æ¤ï¼ç§»å°åå¦Windowsæä½ç³»ç»ï¼ç¨å®ä»¬çææ¬ç¼è¾å¨æå¼æ件éï¼åç°è¯å¥å ä¹å¨åä¸è¡éï¼æ²¡æé®é¢çã
移植性和跨平台有什么区别?
有区别!
移植性,表示源代码在多种系统上几乎不经过修改就可以成功编译。为了达到移植性,尽量按照标准书写代码,如:
void main()
{
printf("hello world");
}
这样的xfce 源码解析代码在有的编译器,如VC6上就可以通过编译,但在其它编译器上就不能被编译,因为它缺少包括的头文件stdio.h,以及main函数返回值不是整形。另外,如果使用了某编译器的扩展函数,如Borland C扩展的 dos.h中的函数,如findfirst, findnext等,这样的代码也不具有移植性。
跨平台主要表示编制一些依赖平台的软件,如一个gui程序,在windows上有着标准的windows窗口和窗口程序。你使用一种编程扩展,如QT编制这类程序,在windows下可以编译为标准windows窗口程序,而在linux下可以具有标准的X窗口程序,其中你编制的源代码只有一份,具体的平台依赖性是通过第三方软件或工具如QT完成的。