構文エラーについて

このQ&Aのポイント
  • プロンプトでコンパイルしようとすると、構文エラーが発生します。extern void __byte_order_changeに関連するエラーが出ます。
  • VSで開くと、'{'が必要ですと指示され、__byte_order_changeの後に名前のないプロトタイプパラメータエラーが表示されます。
  • エラーNo.で検索しても原因がわからず、教えてほしいという要望です。
回答を見る
  • ベストアンサー

構文エラーについて

extern void __byte_order_change(int, int, byte_t*, int) attribute_hidden ; #define __byte_order_to_host(b,p,l) __byte_order_change(b, __STDF_HOST_BYTE_ORDER, p, l) #define __byte_order_to_src(b,p,l) __byte_order_change(__STDF_HOST_BYTE_ORDER, b, p, l) プロンプトでコンパイルしようとすると、上記プログラムの1行目で以下のようなエラーが出ます。 c:\users\10044709\desktop\ttプロジェクト\stdf\libstdf-0.4\src\dtc.h(19) : error C2061: 構文エラー : 識別子 'attribute_hidden' c:\users\10044709\desktop\ttプロジェクト\stdf\libstdf-0.4\src\dtc.h(19) : error C2059: 構文エラー : ';' また、VSで開いてみると、【attribute_hidden】は『'{'が必要です』と表示され、 extern voidの後の【__byte_order_change】には 『名前のないプロトタイプパラメータには、本体が存在する場合は使用することはできません』と 表示されます。 ちなみに【attribute_hidden】の定義先は以下の通りですが、VS上ではエラーは出ていません。 # if !defined(attribute_hidden) # define attribute_hidden __attribute__ ((visibility ("hidden"))) # endif #else # define attribute_unused # if !defined(attribute_hidden) # define attribute_hidden # endif #endif エラーNo.で検索しても原因がよく判らず、 是非とも教示頂きたく、何卒宜しくお願い申し上げます。

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

  • ベストアンサー
  • colder
  • ベストアンサー率43% (30/69)
回答No.3

http://freestdf.sourceforge.net/ ↑これですか? INSTALL ファイルを開いてみたところ VCでのコンパイル法がでていますが、必要なファイルが含まれていないですね。 で、一つ前のバージョンをDLしてみたところ、VCで必要なファイルが含まれているみたいです。 最新版は、VCでコンパイル出来るようにはなっていないのでしょう。

bows_0307
質問者

お礼

その通りです。 わざわざ確認して頂きまして誠に有難う御座います。 足りないファイルは違うサイトから落としてきたり、 インクルードが足りない部分は書き足したりして 何とか思ったとおり(上長には未確認ですが・・・)の変換が 出来ました。

その他の回答 (2)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

使っているコンパイラは VC++ のようですが、GCC の拡張機能である __attribute__ は VC++ では使えないかと思います。 その使えない機能を attribute_hidden マクロで使っているため、VC++ がエラーと出しているように見えます。

bows_0307
質問者

補足

用件と致しまして、 あるオープンソースを使用してコンパイルしそれを元に処理をしたい。 しかし、ソースがC言語ですが未経験の為、ネットで調べた所、VSで開けるとあったのでVSで開いて見ていたり、NMAKEというWin上でもC言語をコンパイルできるとあったので試してみた所、記載のようなエラーが出ております。 知識が無さ過ぎてVC用なの?というお話ですが、それさえも判断が出来ておりませんでした。 現状ではNMAKEは使用せず、MinGWを入れてコンパイルを実施している最中ですが、やはりエラーが出ております。 ちなみに、オープンソースのコンパイル例にて 【gcc -o AAA AAA.c -lstda】とありますが、 『-lstda』とはコンパイルのオプションでしょうか?それともファイル名でしょうか? 上記コマンドをプロンプトより実施した時エラーとして c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lstda collect2.exe: error: ld returned 1 exit status と出力されるのですが、それすら判断できておりません。 以上、何卒宜しくお願い申し上げます。

  • colder
  • ベストアンサー率43% (30/69)
回答No.1

これは、VC用のプログラムなの? ># define attribute_hidden __attribute__ ((visibility ("hidden"))) この構文はGCCの拡張構文のように見えるけど、VCでも使えるの? https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Function-Attributes.html#Function-Attributes

bows_0307
質問者

補足

用件と致しまして、 あるオープンソースを使用してコンパイルしそれを元に処理をしたい。 しかし、ソースがC言語ですが未経験の為、ネットで調べた所、VSで開けるとあったのでVSで開いて見ていたり、NMAKEというWin上でもC言語をコンパイルできるとあったので試してみた所、記載のようなエラーが出ております。 知識が無さ過ぎてVC用なの?というお話ですが、それさえも判断が出来ておりませんでした。 現状ではNMAKEは使用せず、MinGWを入れてコンパイルを実施している最中ですが、やはりエラーが出ております。 ちなみに、オープンソースのコンパイル例にて 【gcc -o AAA AAA.c -lstda】とありますが、 『-lstda』とはコンパイルのオプションでしょうか?それともファイル名でしょうか? 上記コマンドをプロンプトより実施した時エラーとして c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lstda collect2.exe: error: ld returned 1 exit status と出力されるのですが、それすら判断できておりません。 以上、何卒宜しくお願い申し上げます。

関連するQ&A

  • C言語のコンパイル構文エラーについて

    -----一部プログラム抜粋------ int stda_set_setting(stda_file *f, uint32_t option, ...) { va_list ap; dtc_U4 input; va_start(ap, option); input = va_arg(ap, dtc_U4); va_end(ap); switch (option) { case stda_SETTING_WRITE_SIZE: f->_write_chunk_size = input; break; case stda_SETTING_VERSION: f->ver = input; break; case stda_SETTING_BYTE_ORDER: f->byte_order = input; break; } return 0; } void stda_get_setting(stda_file *f, uint32_t option, ...) { va_list ap; dtc_U4 *ret; va_start(ap, option); ret = va_arg(ap, dtc_U4*); va_end(ap); switch (option) { case stda_SETTING_WRITE_SIZE: *ret = f->_write_chunk_size; break; case stda_SETTING_VERSION: *ret = f->ver; break; case stda_SETTING_BYTE_ORDER: *ret = f->byte_order; break; } } /* * UNCOMPRESSED SUPPORT */ static int __stda_open_reg(void *data, int flags, uint32_t mode) { stda_file *stda = (stda_file*)data; /* if filename is NULL we can assume that the fd is already set ... */ if (stda->filename) { if (stda->filename[0] == '-' && stda->filename[1] == '\0') stda->fd = 0; else stda->fd = open(stda->filename, flags, mode); } return stda->fd; } -----一部プログラム抜粋------ 上記ソースにて、【f】と【stda】に 『stda_file *stda』 『Error:式にはpointer-to-struct-or-union 型が必要です』 と表示されますが、エラーメッセージで検索してもピンポイントで出てきません。 非常に初心者的な質問かもしれませんが、C言語が未経験の為、 具体的に何がいけないのかご教示頂きたく投稿させて頂きました。 以上、宜しくお願い致します。

  • error LNK2001について

    C++ の勉強中です。 error LNK2001問題がありました。問題点も分からないから、 分かった方に教えていただけないでしょうか? ソースも添付します。環境はVS2005 express edition まず、ヘッダファイルです。ファイル名は、myheader.h #ifndef __MYHEADER_H__ #define __MYHEADER_H__ #define includeshow(x) \ { \ s.show(x); \ } class Sample{ public: void show(char * parameter); }; extern Sample s; #endif //------------------------------------------------ 次に、Sample.cppです。 #include "myheader.h" #include <stdio.h> void Sample::show(char *parameter){ printf("in show func"); } //----------------------------------------------- 最後にTest.cppです。 #include "myheader.h" #include <stdio.h> int main(){ includeshow("ppppp"); } これで error LNK2001: 外部シンボル ""class Sample s" (?s@@3VSample@@A)" は未解決です。というエラーが出ています。 よろしくおねがいします。

  • C#から、C++作成dll内の関数を呼び出す方法

    C#から、C++で作成したdll内の関数を呼び出す方法は、以下の方法で実現できました。(メッセージボックスで "10" が表示されました) [C++側のヘッダファイル] #ifdef CPPDLL_EXPORTS #define CPPDLL_API __declspec(dllexport) #else #define CPPDLL_API __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ CPPDLL_API int fnCppDll(); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ [C++側のソースファイル] CPPDLL_API int fnCppDll() { return 10; } [C#側] using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsFormsApp1 { public partial class Form1 : Form { [DllImport("CppDll.dll")] public static extern int fnCppDll(); public Form1() { InitializeComponent(); } private void buttonGo_Click(object sender, EventArgs e) { int n = fnCppDll(); MessageBox.Show(n.ToString()); } } } 今回お聞きしたいのは、int型ではなく、C++側で型を定義されたクラスのオブジェクト(の参照)を返す関数を、C#側から呼び出し、それをどうやってC#で受け取るかを教えていただきたいのです。 具体的には以下のように実装してみました。 [C++側のヘッダファイル] #ifdef CPPDLL_EXPORTS #define CPPDLL_API __declspec(dllexport) #else #define CPPDLL_API __declspec(dllimport) #endif class CPPDLL_API CCppDll { public: int data; CCppDll(void); }; #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ CPPDLL_API CCppDll& fnCppDll(); // C#が参照渡しということで、参照を返すようにした。 #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ [C++側のソースファイル] CPPDLL_API CCppDll& fnCppDll() { CCppDll* a = new CCppDll(); return *a; } CCppDll::CCppDll() : data(11) // メンバーは 11 で初期化 { } [C#側] using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsFormsApp1 { // ビルドエラーが起きるないように、とりあえず、C++と同じ(ような)クラスを定義 public class CCppDll { public int data; } public partial class Form1 : Form { [DllImport("CppDll.dll")] public static extern CCppDll fnCppDll(); public Form1() { InitializeComponent(); } private void buttonGo_Click(object sender, EventArgs e) { int n; CCppDll cls = fnCppDll(); // ※ n = cls.data; MessageBox.Show(n.ToString()); } private void buttonCancel_Click(object sender, EventArgs e) { Close(); } } } 実装しながらも、「これじゃあ、ダメだろうな。いかにもダメだな」と思った通り、上の※の部分で以下の例外が発生しました。 ------- 例外(ここから) ------- マネージド デバッグ アシスタント 'FatalExecutionEngineError' : 'ランタイムの重大なエラーが発生しました。エラーのアドレスは 0xcc9ff5a2、スレッド 0x36c8 です。エラー コードは 0xc0000005 です。これは CLR のバグであるか、またはユーザー コードのアンセーフまたは確認不可能な部分にバグがある可能性があります。このバグの一般的な原因には、スタックが壊れる可能性のある COM-interop または PInvoke のユーザー マーシャリング エラーが含まれています。' ------- 例外(ここまで) ------- 明らかに基本的なことが分かっていないことから起因するエラーと思われますが、具体的にどう実装すれば、正常に動きますか。(メッセージボックスで "11" を表示) よろしくお願いします。

  • エラーの原因が分かりません "undefined reference to"

    ライブラリのヘッダファイル matrix.h #ifndef MATRIX_H #define MATRIX_H #ifdef __cplusplus extern "C"{ #endif typedef struct{ int row,col; double *elements; } MATRIX; extern int matrix_error_code; extern void zero_matrix(MATRIX *a); extern void identity_matrix(MATRIX *a); extern void show_matrix(MATRIX *x); extern MATRIX multiply_matrix(MATRIX *a,MATRIX *b); extern MATRIX transposed_matrix(MATRIX *a); #ifdef __cplusplus } #endif #endif ライブラリのソースファイル matrix.c #include <stdio.h> #include <stdlib.h> #include <math.h> #include "matrix.h" int matrix_error_code = 0; void zero_matrix(MATRIX *a) { int i,size; double *p; size=a->row*a->col; if((p = malloc(sizeof(double)*size)) == NULL) { puts("メモリを確保できません."); exit(0); } a->elements=p; for(i=0;i<size;i++) *p++=0; } void identity_matrix(MATRIX *a) { int i; zero_matrix(a); for(i=0;i<a->row;i++) { *(a->elements+i*a->col+i)=1.0000; } } void show_matrix(MATRIX *x) { int i,j; for(i=0;i<x->row;i++) { for(j=0;j<x->col;j++) { printf("%3.4lf ",*(x->elements+i*x->col+j)); } printf("\n"); } printf("\n"); } MATRIX transposed_matrix(MATRIX *a) { MATRIX x; int i,j; double *p; if((p = malloc(sizeof(double)*(a->row*a->col))) == NULL) { puts("メモリを確保できません."); exit(0); } x.elements=p; x.row=a->col; x.col=a->row; for(i=0;i<x.row;i++) { for(j=0;j<x.col;j++) { *p++=*(a->elements+j*x.row+i); } } return x; } MATRIX multiply_matrix(MATRIX *a,MATRIX *b) { int i,j,k; double *p; MATRIX x; x.row=a->row; x.col=b->col; if((p = malloc(sizeof(double)*(x.row*x.col))) == NULL) { puts("メモリを確保できません."); exit(0); } x.elements=p; for(i=0;i<x.row;i++) { for(j=0;j<x.col;j++) { for(k=0;k<a->col;k++) { *p += *(a->elements+i*a->col+k) * *(b->elements+k*b->row+j); } } p++; } return x; } 動作確認のアプリケーションファイル test_matrix.c #include <stdio.h> #include "matrix.h" int main(void) { int i,j; MATRIX b,c,d,f; b.row=c.row=2; b.col=c.col=2; identity_matrix(&b); identity_matrix(&c); d=transposed_matrix(&b); show_matrix(&d); f=multiply_matrix(&b,&c); show_matrix(&f); return 0; } ライブラリのコンパイルまではエラーなしで出来るのですが、test_matrix.cをコンパイルすると、"undefined reference to '_transposed_matrix'"と、"undefined reference to '_multiply_matrix'"の2つが表示されてコンパイルができません。 どうかよろしくお願いします。

  • 関数式マクロでエラーです。

    原因と解決方法を教えてください。 御願いします。 ・現象  Solarisでは問題なくコンパイル出来ますが、Linux(以下のバージョン参照)上ではエラーになります。  他の人によるとgcc 2.xでは問題なけれど、gcc 3.x以上ではエラーになると聞きましたが… ・質問  1.コンパイラのバージョン問題ですか?  2.解決するにはパッチが必要ですか?  3.必要だったら、何のパッチが必要ですか?  (ソースの修正なしで解決したいです。) ・エラーメッセージ: define_test.c:38:1: pasting "_test" and "(" does not give a valid preprocessing token Kernel:Red Hat Enterprise Linux AS release 4 (Nahant) Compiler:g++ (GCC) 3.4.3 20041212 (Red Hat 3.4.3-9.EL4) -- 以下 ソース -- #include <stdio.h> #include <stdlib.h> #define SEND4(o, m, l, on_off) o->send_extr_indir(o->_##m##l, on_off) class Define { public: int send_extr_indir(int data1, int data2); int _test(int arg1, int arg2); int test(void); }; int Define::send_extr_indir(int data1, int data2) { printf("data1=%d\n", data1); printf("data2=%d\n", data2); return data1+data2; } int Define::_test(int arg1, int arg2) { return arg1 + arg2; } int Define::test(void) { return SEND4(this, test, (1,2), 5 ); } int main(void) { int result = 0; Define object; result = object.test(); printf("result=%d\n", result); return 0; }

  • C++ なのですがエラーが消えません

    課題のC++プログラムのエラーが消えません,教えてください. 10個の数値を入力し並び替えるプログラムなのですが並び替え部分以外は先生作成のプログラムです. どうかお願いいたします. #include <stdio.h> #define MAX 10 #define OK 0 void inputnum(int num[]); void sortnum(int num[]); void outputnum(int num[]); main(){ int num[MAX]; printf("番号 氏名\n"); inputnum(num); sortnum(num); outputnum(num); return(OK); } void inputnum(int num[]){ int i; for(i=0;i<MAX;i++,num[i]){ printf("数値%d = ", i+1); scanf("%d",&num[i]); } printf("数値入力完了\n"); } void sortnum(int num[]){ int tmp,p,q; for(p = 0; p < 9; p++){ for(q = p + 1; q < 10; q++){ if(num[p] > num[q]){ tmp = num[p]; num[p] = num[q]; num[q] = tmp; } } } printf("並び替え完了\n"); void outputnum(int num[]){ int i; for(i=0;i<MAX;i++){ printf("数値%d = %d\n",i+1,num[i]); } printf("数値出力完了\n"); }; [エラー  Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 1142122.c: エラー E2140 1142122.c 46: ここでは宣言はできない(関数 sortnum ) エラー E2141 1142122.c 46: 宣言の構文エラー(関数 sortnum ) エラー E2134 1142122.c 54: 複合文に } がない(関数 sortnum ) *** 3 errors in Compile ***]

  • グローバル変数

    分割コンパイルで、持ちいる変数をヘッダーファイルに宣言しました。 ヘッダーファイル内で次のように宣言し、メインの関数でない場合にはexternになるようにしました。 メインなら FILEは1 それ以外なら0 #if FILE   unsinged int inputNo; #else  extern unsigned int inputNo; #endif しかし、リンクをさせると error LNK2001: 外部シンボル "_inputNo" は未解決です と出てしまいます。解決策はあるでしょうか? プロジェクトの設定の関係でしょうか?よろしくお願い致します。

  • atoi() 実行エラー

    以下のプログラムをコンパイル・実行しようとすると、コンパイルはエラーなくできますが、実行すると「プログラムは動作を停止しました」という表示が出て、エラーになってしまいます。 たぶんatoi()が原因だと思うのですが、何が問題なのでしょうか? それとも環境の問題でしょうか? どなたかご存知の方がいらしたら教えてもらえないでしょうか。 <環境> VISTA、VC++ //------ここから---------- #include <stdio.h> #include <stdlib.h> #define AAA atoi(argv[1]) #define BBB atoi(argv[2]) #define CCC atoi(argv[3]) #define DDD atoi(argv[4]) #define EEE atoi(argv[5]) #define FFF atoi(argv[6]) #define GGG atoi(argv[7]) int main(int argc, char **argv) { FILE *fo; int i, j, k, l, m, v, cnt1; int v_tmp = CCC; int x_cnt; int y_cnt = 0; int cnt = 0; int arr[8190]; if(argc != 9){ printf("引数の数が違います。\n"); printf("使用法:<プログラム名><AAA><BBB><CCC>\n"); printf(" <DDD><EEE><FFF><GGG><出力ファイル名>"); exit(1); } if((fo = fopen(argv[8], "w"))==NULL){ printf("can not open file\n"); exit(1); } v = v_tmp; for(l=0; l<AAA; l++){ arr[l] = v; cnt++; if(cnt == FFF){ v += DDD; cnt = 0; } } for(i=0; i<BBB; i++){ m = 1; cnt1 = 0; x_cnt = 0; while(x_cnt < AAA){ fprintf(fo, "%04x", arr[m]); x_cnt++; if(!(x_cnt%2)) fprintf(fo, "\n"); cnt1++; if(cnt1%2){ }else{ m += 3; } m -= 1; } y_cnt++; if(y_cnt == GGG){ v_tmp += EEE; y_cnt = 0; v = v_tmp; cnt = 0; for(l=0; l<AAA; l++){ arr[l] = v; cnt++; if(cnt == FFF){ v += DDD; cnt = 0; } } } } fclose(fo); return 0; }

  • ライブラリで宣言した構造体が認識されない

    ライブラリのヘッダファイル complex.h #ifndef COMPLEX_H #define COMPLEX_H #ifdef __cplusplus extern "C"{ #endif typedef struct{ double real,imaginary; } COMPLEX; extern int complex_error_code; extern COMPLEX add_complex(COMPLEX a ,COMPLEX b); #ifdef __cplusplus } #endif #endif ライブラリのソースファイル complex.c #include <stdio.h> #include <math.h> #include "complex.h" int complex_error_code = 0; COMPLEX add_complex(COMPLEX a ,COMPLEX b) { COMPLEX c; c.real=a.real+b.real; c.imaginary=a.imaginary+b.imaginary; return c; } 動作確認のアプリケーションファイル test_complex.c #include <stdio.h> int main(void) { COMPLEX z,z1,z2; z1={1.0,1.0}; z2={2.0,2.0}; z=add_complex(z1,z2); printf("%lf+%lfi",z.real,z.imaginary); return 0; } COMPLEX undeclared (first use in this function) というエラーメッセージが出て、宣言したはずの構造体COMPLEXが認識されていないようなのですが、理由がわかりません。 よろしくお願いします。

  • C++の組込みマクロのassert()が使えない

    こんにちは。 CygwinでC++開発を行っているのですが、C++の関数型マクロであるassert()が使えなくて困っています。 main関数を含むソースファイルに、 #include assert.h を記述しておけば使えるはずなのですが、そのソースファイルから実行ファイルを、 g++コマンドでビルドしようとすると、以下のようなエラーが出ます。 ------------------------------------------------------------ $ g++ test03-STLの使用.cpp /cygdrive/c/Users/Kei/AppData/Local/Temp/cckwDP4e.o:test03-STLの使用.cpp:(.text+0x904): undefined reference to `___assert_func' collect2: ld はステータス 1 で終了しました ------------------------------------------------------------ test03-STLの使用.cpp のmain関数は、以下の通りです。 ------------------------------------------------------------ int main() { string s="ABC DEF\nGH\tIJ"; reverse(s.begin(), s.end() ); assert(s=="JI\tHG\nFED CBA"); cout<<s return 0; } ------------------------------------------------------------ ちなみに、実際にインクルードされる /usr/include/assert.h の内容は以下のようになっていました。 ------------------------------------------------------------ /* assert.h */ #ifdef __cplusplus extern "C" { #endif #include "_ansi.h" #undef assert #ifdef NDEBUG /* required by ANSI standard */ # define assert(__e) ((void)0) #else # define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \ __ASSERT_FUNC, #__e)) # ifndef __ASSERT_FUNC /* Use g++'s demangled names in C++. */ # if defined __cplusplus && defined __GNUC__ # define __ASSERT_FUNC __PRETTY_FUNCTION__ /* C99 requires the use of __func__. */ # elif __STDC_VERSION__ >= 199901L # define __ASSERT_FUNC __func__ /* Older versions of gcc don't have __func__ but can use __FUNCTION__. */ # elif __GNUC__ >= 2 # define __ASSERT_FUNC __FUNCTION__ /* failed to detect __func__ support. */ # else # define __ASSERT_FUNC ((char *) 0) # endif # endif /* !__ASSERT_FUNC */ #endif /* !NDEBUG */ void _EXFUN(__assert, (const char *, int, const char *) _ATTRIBUTE ((__noreturn__))); void _EXFUN(__assert_func, (const char *, int, const char *, const char *) _ATTRIBUTE ((__noreturn__))); #ifdef __cplusplus } #endif ------------------------------------------------------------ Borland C++ Compilerのbcc32コマンドでは、先ほどのソースファイルから実行ファイルをビルドすることができたので、何が問題なのかが分かりません。 以上の件について何かご存知の方がいらっしゃれば、是非教えて頂きたいと思います。 では、よろしくお願い致します。

専門家に質問してみよう