ページ 11

#define _CRT_SECURE_NO_WARNINGS?

Posted: 2014年6月07日(土) 15:39
by hyr333
fopen関数を使うとmay be unsafe~とエラーが出るので
ネットで調べたところ、#include<stdio.h>の前に#define _CRT_SECURE_NO_WARNINGSを挿入すればエラーが回避できると
ありました。

で、その通りにやってみたところ(先頭一文以外のソースはほぼ丸写しです)

コード:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main() {

	FILE * fp;
	int ret;
	char getstr[4];
	int getint;

	/* Windowsの場合はtest.txt */
	fp = fopen("test.txt", "r");
	if (fp == NULL) {
		printf("ファイルオープンエラー\n");
		return -1;
	}

	/* ファイルから各変数に変換して代入 */
	while ((ret = fscanf(fp, "%s%d", getstr, &getint))
		!= EOF) {
		/* 変換して代入された変数を表示 */
		printf("getstr=%s\n", getstr);
		printf("getint=%d\n", getint);
		printf("ret=%d\n", ret);
	}

	printf("\nret=%d\n", ret);/* -1 */

	fclose(fp);

	return 0;
}
そしてその実行結果が
エラー 2 error LNK1120: 1 件の未解決の外部参照 C:\Users\(2バイト文字ユーザー名)\Documents\Visual Studio 2013\Projects\Win32Project3\Debug\Win32Project3.exe 1 1 Win32Project3
エラー 1 error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。 C:\Users\(2バイト文字ユーザー名)\Documents\Visual Studio 2013\Projects\Win32Project3\LIBCMTD.lib(wincrt0.obj) Win32Project3

どのように解決したらよろしいのでしょうか
ご教授お願いいたします
OSはWindows8.1
VisualStudioExpress 2013を使用しています。

Re: #define _CRT_SECURE_NO_WARNINGS?

Posted: 2014年6月07日(土) 17:48
by 初級者
fopenの話とはおそらく無関係でしょう。
コンソールアプリ
を作ろうとしているのに、
プロジェクトの設定が
Windowsアプリ
を作るようになっているから、
WinMain
がない!
と怒られているのでありましょう。

なお、そのプログラムは、まだ
実行できる状態にはなっていません。
実行結果ではなく、
ビルド結果
あるいは
コンパイル、リンク結果
であって、そのエラーは
リンク時のエラーです。

Re: #define _CRT_SECURE_NO_WARNINGS?

Posted: 2014年6月08日(日) 11:34
by うずら
初級者さんが言うように、

int main()

この宣言が間違っています。
リンカはWinMainを参照しようとしているようです。

int main()
はコンソールアプリケーションのためのmain関数です。
リンカがWinMain()を参照しているということは、そのプロジェクトはWin32プロジェクトなはずです。

Win32プロジェクトのmain関数は

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

になります。

ただ、printf を使っているようなので、Win32コンソールアプリケーションで作り直せば動作するはずです。
試してませんが。

Re: #define _CRT_SECURE_NO_WARNINGS?

Posted: 2014年6月08日(日) 16:33
by 初級者
うずら さんが書きました:
int main()

この宣言が間違っています。
私はそんなことは言っておりません。
それに、宣言ではなく定義です。

当該のコードは、明らかにコンソールアプリケーションを作成するためのものです。
よって、
main関数が存在しなければなりません。
そういう意味で、
main関数に関する宣言(もしくは定義)が間違っている、という指摘そのものが間違いです。