typedef定義型を使った関数について

このQ&Aのポイント
  • Visual C++ 2008 Express Editionを使ってC言語のソースコードを記述しています。ビルドを行った際にエラーが発生し、解決方法がわからず質問させていただいた次第です。
  • 上記のソースコードでビルドを行ったところ、構文エラーが発生しています。特に、識別子 'GetInfo' のエラーが発生しており、どのように修正すれば良いかわかりません。
  • 上記のソースコードでは、typedef定義型を使って関数を宣言しています。Infoという構造体型を定義し、その型を返り値とする関数GetInfoを宣言しています。
回答を見る
  • ベストアンサー

typedef定義型を使った関数について

はじめて質問させていただきます。 Visual C++ 2008 Express Editionを使ってC言語のソースコードを記述しています。 (OSはWindows XPを使用しています。) ビルドを行った際に以下のエラーが発生していて、先に進めません。 色々と調べてみたのですが、解決方法がわからず質問させていただいた次第です。 解決方法についてご存知の方がいらっしゃいましたら、回答いただけると嬉しいです。 ■エラー内容 ------ ビルド開始: プロジェクト: Sample, 構成: Debug Win32 ------ コンパイルしています... Sample.c d:\sample\sample\Sample.c(4) : error C2061: 構文エラー : 識別子 'GetInfo' d:\sample\sample\Sample.c(4) : error C2059: 構文エラー : ';' d:\sample\sample\Sample.c(4) : error C2059: 構文エラー : ')' ビルドログは "file://d:\Sample\Sample\Debug\BuildLog.htm" に保存されました。 Sample - エラー 3、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== ■Sample.c #include "stdafx.h" Info GetInfo(){ return 0; } int main(){ return 0; } ■stdafx.h #pragma once #include "def.h" #include <stdio.h> #include <tchar.h> Info GetInfo(); ■def.h typedef struct Info{ int a; int b; int c; } Info;

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

掲示されているソースでビルドしましたが… >\my documents\visual studio 2008\projects\qa6421111\qa6421111\sample.c(4) : error C2440: 'return' : 'int' から 'Info' に変換できません。 となっただけ(当然の結果)…ですね。 # sample.cは#includeから始まりますので、4行目はreturnのある行です。 # 質問者さんのソースで先頭に空行があるのでしょうけど。 ちなみに、プロジェクトは「Win32 コンソールアプリケーション」で「空のプロジェクト」としています。

rin1100
質問者

お礼

ご回答ありがとうございます。 記載いただいておりましたように、「空のプロジェクト」から作成して同様のソースを記述すると、「error C2440:'return' : 'int' から 'Info' に変換できません」となりました。 Sample.cのInfo GetInfo()部分を以下のように修正しましたところ、正常にビルドできるようになりました。 ------ Info GetInfo(){ struct Info taginfo = {1,2,3}; return taginfo; } ------ 「空のプロジェクト」として作成する以外は、プロパティの設定等をまったく同じにしたのですが、正常にビルドできています。 ちなみに、知識不足で大変申し訳ないのですが、「空のプロジェクト」として作成する場合としない場合でビルド結果が変わるのはなぜなのでしょうか? #参考になりそうなURLなどがありましたら、URLのご提示でも構いませんので、ご教示いただけると幸いです。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

#1です … 勇み足だったようですね 今開発環境が手元にないので ちょと調べることができません 夜中になれば帰宅できるのでそれから調べてみますね ^^; typedefでこけるなら ヘッダーでもこけそうですね ・・・

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>構造体のタグ名とtypedefでの定義が同じであるためにコンパイラがどちらか判断できないでいるのだと思います 両者の名前空間は別々なので、同じ名前を付けてもコンパイラーは混乱しないはずです。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

構造体のタグ名とtypedefでの定義が同じであるためにコンパイラがどちらか判断できないでいるのだと思います typedef struct tagInfo {   int a;   int b;   int c; } Info; といった具合に タグ名と定義名称を変えてみましょう

rin1100
質問者

お礼

ご回答ありがとうございます。 ご指摘のように修正してみましたが、エラーは改善されませんでした。 # エラー内容にも変化がないようです。 他に、何かお気づきの点があればご教示くださいますと幸いです。

関連するQ&A

  • Microsoft visual C++ Express Edtionでビルドできない

    Microsoft visual C++ Express Edtionを使っていますが、次のプログラムをビルドして、実行ファイルを使おうとすると次のエラーがでます。何処が違っているでしょうか? /* 整数値との和を表示する */ #include <stdio.h> int main(void) { printf("%d", 15 + 37); return (0); } ------ ビルド開始: プロジェクト: test2, 構成: Debug Win32 ------ リンクしています... LINK : fatal error LNK1104: ファイル'.\Debug\stdafx.obj' を開くことができません。 ビルドログは"file://d:\MYDOCUMENTS\Visual Studio 2005\Projects\test2\test2\Debug\BuildLog.htm" に保存されました。 test2 - エラー1、警告0 ========== ビルド: 0 正常終了、失敗、更新、スキップ==========

  • C言語のtypedefの質問

    Cビギナーです。 私のプログラムが長くなるのは、 ファイルの分割をしてないからだと知った今日この頃なのですが、 それを勉強するためにあるホームページを見ていたのですが、 次のようなサンプルプログラムがありました。 /* main.c */ #include <stdio.h> extern int func(int); typedef int (*pf)(int); extern pf getaddress(void); int main(void) { printf("%d\n",(getaddress())(4)); return 0; } /* sub.c */ static int func(int c) { return c*10; } typedef int (*pf)(int); pf getaddress(void) { return func; } ここで、typedef int (*pf)(int);の部分が分かりません。 intを(*pf)(int)で置き換えているのでしょうが、 それ自体がどういう意味か分かりません… どなたか教えて下さい。

  • C++の関数で

    Visual C++で6の4乗を求めるプログラムを作ろうとしたのですがうまくいきません。どこが間違っているか教えていただけないでしょうか? #include "stdafx.h" int get; bekijyo(int,int); void main(void) { int number1,number2; int kekka; number1=6; number2=4; kekka=get; bekijyo(number1,number2); printf("%dの%dは%dです。); } int getbekijo(int x,int y) { int z; if(y==1) return(x); z=x; getbekijyo(x,y-1); return(z); }

  • system関数がうまくいかない

    windows c++ でsystem関数を使い任意の実行ファイルを動かそうとしてもうまくいきません。 エラーはcharからintにイニシャライズできません となります。また実行ファイルにスペースがあったら不味いのでしょうか。 #include <stdio.h> #include <stdlib.h> int main (void) { int=system("C:/Documents and Settings/shun/My Documents/aaa/project abc1/Debug/project abc1.exe"); return 0; }

  • 関数でエラー

    #include<stdio.h> int func(int, int); int main() { int a, b, c; a = 10; b = 20; c = func(a, b); printf("%d x %d" = %d\n", a, b, c) return 0; } int func(int a, int b) { int c; c = a * b; return c; } エラーが出てしまうのですが、どうしてエラーが出るのか教えて頂けないでしょうか? エラー一覧です。 ------------------------------------------------------------------------------------------------------------------------------- 配列型 const char[8]を割り当てることはできません。 14行目 ;がreturnの前にありません              16行目 式は変更可能な左辺値である必要があります      14行目 ;が必要です                     16行目 よろしくお願いします。

  • VC++6.0 DLLの作り方

    VC++6.0でWin32 Dynamic-Link Libraryプロジェクトを作成しようとしました。 練習用に足し算と引き算です。 StdAfx.cpp test99.cpp StdAfx.h ReadMe.txt Basetsd.hなど、いろいろなファイルが出来ています。 これを親プログラムから、#include "StdAfx.h"としてリンクさせたいのですが、 StdAfx.hに、関数を公開しなければならないと思います。 StdAfx.hは、何を行うヘッダーファイルなのか? 何処に何を記述するのがベストでしょうか? VC++の生成した日本語のコメントの意味が今ひとつ理解できません。 以下はtest99.cpp #include "stdafx.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } __declspec(dllexport) int WINAPI tasizan(int a,int b) {return (a+b);} __declspec(dllexport) int WINAPI hikizan(int a,int b) {return (a-b);} 以下はStdAfx.cpp #include "stdafx.h" 以下はStdAfx.h #if !defined(AFX_STDAFX_H__D849B748_701B_483D_9457_AA6096D78FB0__INCLUDED_) #define AFX_STDAFX_H__D849B748_701B_483D_9457_AA6096D78FB0__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN #include <windows.h> //????????__declspec(dllexport) int WINAPI tasizan(int,int); //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。 #endif // !defined(AFX_STDAFX_H__D849B748_701B_483D_9457_AA6096D78FB0__INCLUDED_)

  • ファイルの読み込みと書き込み

    はじめまして。 最近プログラムを勉強し始めたのですが、ファイルの書き込みと 読み込みで行き詰ってしまいました。 ファイルAで演算したものをファイルBで読み込み表示したいと思い、 以下のようなプログラムを作成したのですが、エラーが出てしまいます。 かなり初歩的なこととは思いますが、アドバイスをお願いします。 【ヘッダファイル(stdafx.h)】 #include <stdio.h> #include <tchar.h> #include <fstream> #include <iostream> 【ソースファイルA】 #include "stdafx.h" using namespace std; int main() { int a; cout << "数値入力:" ; cin >> a; a = a * 2; ofstream fout("sample.txt"); fout << a; fout.close(); return 0; } 【ソースファイルB】 #include "stdafx.h" using namespace std; int main() { ifstream fin("sample.txt"); fin >> a;     fin.close(); int b; b = a; cout << "結果 = " << b << '\n'; return 0; }

  • 2次元配列  CXX0030というエラーの解決について

    おいそがしいところを失礼します。 visual C++2005で、巨大な2次元配列c[][]のプログラムを作成してエラーが出て進まないところです。 データが多すぎるのかとも思っていますが、デバックで確認するとcの値が出ません。 というのは、cの値が”cxx0030;エラーです;式を表記できません”という表示が出てしまいます。 ビルドでは通るのですが、デバックしてもcで引っかかってしまい、実行できません。 巨大処理のため、mallocを使う方法を考えていますので double** c; という宣言をしています。 下記のような簡単なソースにしてもCXX0030の表記が出ます。 どなたかアドバイスありましたらどうかよろしくお願いします。 //////////////////////////////////////////////////////// #include<stdafx.h> #include<stdio.h> #include<math.h> #include<string.h> #include<conio.h> #include<stdlib.h> #include<time.h> #include <locale.h> int main() { double a[10000]; double b[10000]; double **c; return 0; } ///////////////////////////////////////////////////////////

  • LKMの分割コンパイルについて

    こんばんは、自分は今LKMの分割コンパイルに挑戦しています。 以下のようなファイルを作成して、モジュールを作ってみました。 [Makefile] obj-m := message.o message-objs := message.o sample_func.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -f *.o *.ko *.symvers *~ *.mod.c [message.c] #include <linux/module.h> #include <linux/kernel.h> #include "sample_func.h" static char *msg = "[message.o]:"; static int message_module(void) { printk(KERN_INFO "%s loaded\n",msg); printk(KERN_INFO "%s %d\n", msg, sample_add(2,3)); return 0; } static void message_remove(void) { printk(KERN_INFO "%s removed\n", msg); } module_init(message_module); module_exit(message_remove); [sample_func.c] #include "sample_func.h" static int inner_add(int,int); int sample_add(int a, int b) { return inner_add(a,b); } static int inner_add(int a, int b) { return a+b; } [sample_func.h] int sample_add(int,int); コンパイルは正しく通るようなのですが、/var/log/messages に何も出力がありません。 (KERN_INFOを指定しているので/var/log/messagesに出力されると思っているのですが。。。) lsmodで確認したところ、モジュールはカーネル内に正常に組み込まれているようでした。 どなたか解決方法をご存知の方教えていただけないでしょうか。 宜しくお願いします。

  • dynamic_cast exception: __non_rtti_object @

    C++の勉強をしています。 参考書を元に以下のようなコードを書き、実行したところエラーが発生しました。 原因が分かる方がいれば教えて頂けないでしょうか? よろしくお願いします。 [環境] Windows XP Visual Stadio .NET ----------------コード------------------- #include "stdafx.h" #include "test.h" #include <stdio.h> #include <string> #include <vector> #ifdef _DEBUG #define new DEBUG_NEW #endif // 唯一のアプリケーション オブジェクトです。 CWinApp theApp; using namespace std; class W1 { public: virtual int GetData() {return 10;} }; class W2 :public W1 { public: int GetData() {return 100;} }; void update(W2 *p) { if (p == NULL) return; int iData = 0; iData = p->GetData(); printf("%d\n", iData); } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { W2 w2; W1 *pw = &w2; int iData = 0; iData = pw->GetData(); //Cスタイルのキャスト。 //ここでは問題なし。 update((W2*)pw);      //C++スタイルでのキャスト //この関数の中に入ろうと //とすると、エラーになる。            update(dynamic_cast<W2*>(pw)); return 0; } ----------------------------------------------------- [エラー内容] test.exe の 0x7c812a5b でハンドルされていない例外が発生しました : Microsoft C++ exception: __non_rtti_object @ 0x0012fe18。

専門家に質問してみよう