iT邦幫忙

0

Dev C++ vs Visual Studio編譯器問題

c c++

我最近在練程式時,發現一個小問題
同一個程式(C++/C),在兩個編譯器都有不同結果
Dev C++ 版本:5.11
Visual Studio 版本:2017 15.8

程式碼如下:

#include <stdio.h>	
#include <stdlib.h>	
#include <string.h>	
struct BOX {
	int size = 10;
	char cname[6] = "Tom" ;
}TTbox;

int main() {
	printf("%d\n", TTbox.size);
	printf("%s\n", TTbox.cname);
	strcpy(TTbox.cname, "Peter");
	printf("%s\n", TTbox.cname);
	system("pause");
}

以上程式,Dev C++可以輸出結果;但Visual Studio不行
Visual Studio表示:strcpy有異常,不能使用
https://ithelp.ithome.com.tw/upload/images/20180914/20107818dm7GKDDWel.png
但,如果不用strcpy,要更改字串就需要TTbox.cname[0],TTbox.cname[1]....


另一個程式

#include <stdio.h>	
#include <stdlib.h>	
#include <string.h>	
struct BOX {
	int size = 10;
	char cname[5] = "Tom";
};

int main() {
	struct BOX TTbox = { 50,"Sam" };
	printf("%d\n", TTbox.size);
	printf("%s\n", TTbox.cname);
	system("pause");
}

以上程式,Dev C++不行;而Visual Studio可以輸出結果
https://ithelp.ithome.com.tw/upload/images/20180914/201078187dwKJzl172.png
Dev C++表示:struct BOX TTbox = { 50,"Sam" }中的{ }有問題
所以Dev C++不能新增struct的同時,把所有參數加入進去?

想問為什麼會有這樣問題,要如何解決?

wwx iT邦研究生 1 級 ‧ 2018-09-15 18:32:04 檢舉
第一個只是提醒, C4996的訊息可以用下面的macro停掉
#pragma warning(disable:4996)

第二個是因為結構宣告和程式中都有給預設值,
如果把結構宣告中的預設值拿掉就可以通用了

2 個回答

0
小魚
iT邦好手 1 級 ‧ 2018-09-14 19:36:02

不同編譯器的解讀方式不一樣,
甚至某些未定義的行為會產生不同的結果,
解決方式就是自己寫一個自己喜歡的編譯器 (逃

有些編譯器會加一些比較方便的功能,
但是其他的編譯器不一定會有,
找一種自己的喜歡來用習慣就好了,
這沒有對與錯,
用習慣就好了。

這裡還有很多編譯器,
有時間的話你可以整理一個表格列出每個編譯器不一樣的地方
深受C/C++程式設計師歡迎的11款IDE

看更多先前的回應...收起先前的回應...
Homura iT邦研究生 5 級 ‧ 2018-09-14 23:16:09 檢舉

可以吐槽一下IDE和Compiler是不同東西嗎?/images/emoticon/emoticon04.gif

小魚 iT邦好手 1 級 ‧ 2018-09-15 00:22:00 檢舉

Homura
可以,讓你吐槽,
不過吐槽請多加一些專業的見解,
謝謝~
/images/emoticon/emoticon41.gif

Homura iT邦研究生 5 級 ‧ 2018-09-15 00:34:42 檢舉

不是所有IDE都有含Compiler
例如上面貼的連結裡面的Eclipse就沒有
現在很多Compiler都在含在程式語言的SDK安裝包裡
例如JavaJDK.NET Core.NET Core SDK

小魚 iT邦好手 1 級 ‧ 2018-09-15 08:06:13 檢舉

Homura
喔喔,所以你的意思是說Eclipse本身是IDE但不是Compiler,
Compiler其實是Java的SDK之類的,
難怪安裝Eclipse寫手機程式都要先安裝Java的SDK...

3
weiclin
iT邦高手 4 級 ‧ 2018-09-14 20:21:40

第一個問題, strcpy 不是不能用, 而是他有安全問題所以預設會擋掉, 解決的方式也寫在錯誤訊息裡面了, 看是要改用 strncpy 還是想辦法關掉這個檢查都可以。

想想看:

strcpy(TTbox.cname, "Christina");

是不是超過了你的 char cname[6] 能放的數量? 這就是一個可以攻擊的點, 造成的安全漏洞是很嚴重的。strncpy 因為能夠指定複製的長度上限所以可以避開這個問題。

第二個問題, 錯誤訊息也都告訴你了, Dev C++ 用的是 C++98 的標準去編譯的, 所以你應該去加個編譯參數使用 C++11 或 C++0x 就行了, 不同的標準對語法的支援有差異是很正常的。

我要發表回答

立即登入回答