2012-06-15 1 views
0

나는 cuda 코드가 포함 된 cmake 프로젝트를 빌드 중입니다. 여러 h 파일을 포함하는 cuda 파일 중 하나를 컴파일 할 수 없습니다. 이것은 내가 locale_facets.h의 isspace 함수와 충돌하는 isspace 매크로

In file included from /usr/include/c++/4.4/bits/basic_ios.h:39, 
       from /usr/include/c++/4.4/ios:45, 
       from /usr/include/c++/4.4/ostream:40, 
       from /usr/include/c++/4.4/iostream:40, 
       from /home/pfeifs/Developement/Deform/LinuxDeform/LibDeform/Deform/cutil_comfunc.h:20, 
       from /home/pfeifs/Developement/Deform/LinuxDeform/LibDeform/Deform/VectorMathDef.h:22, 
       from /home/pfeifs/Developement/Deform/LinuxDeform/LibDeform/src/Deform/VectorMath.cu:15: 
/usr/include/c++/4.4/bits/locale_facets.h:2521:44: error: macro "isspace" passed 2 arguments, but takes just 1 

isspace()

<ctype.h>에서 하나 개의 인자를 필요로하는 매크로로 정의하고 locale_facets.h의 템플릿 함수로 선언받을 컴파일러 오류입니다. (이들은 모두 표준 파일입니다.) 그러나 locale_facets.h의 시작 부분에 <cctype>이 포함되어 있으며 매크로가 선언되지 않습니다.

이 문제에 대한 도움이나 의견을 보내 주시면 대단히 감사하겠습니다.

+0

'cutil_comfunc.h' 파일에서 #include 파일 순서를 재정렬하여 C++ include가 C includes보다 앞에 오도록하십시오. – jxh

답변

5

C 및 C++ 헤더를 혼합하고 일치시키지 마십시오.

두 개의 매개 변수를 사용하여 std::isspace 템플릿을 가져 오려면 #include <locale>을 사용하십시오. STL과 충돌을 일으키지 않는 ctype.h의 C++ 안전 포함에는 #include <cctype>을 사용하십시오.

C 프로그램을 작성하고 C++가 필요하거나 필요하지 않은 경우 ctype.h을 포함하고 하나의 매개 변수에만 isspace 함수를 사용하면 문제가 발생하지 않습니다.

+0

첫 번째 문장이 +1이면 +1. 나는 나머지는 옳다고 추측하고 있지만 그렇지 않은 경우에도 첫 번째 문장이 문제의 핵심입니다. –

+0

사실 추가 ctype.h 파일은 내가 포함시키려는 표준 ctype 라이브러리보다 포함 경로의 앞부분에 포함될 필요가있는 다른 임의 라이브러리의 포함 경로에 있습니다. 나는 그걸 해결할 수 있었고 모든 것이 올바르게 작동했습니다. – Scottfivefour

+1

완벽한! 또한 올바른 방법은 없지만 내 포함 순서가 그렇게되면 문제가 적다는 사실을 발견했습니다. C++, 제 3 자 라이브러리, 내 libs, 로컬 헤더 – AJG85