2013-05-21 3 views
1

이렇게 할 수 있습니까?#define을 만들고 throw에서 사용할 수 있습니까?

#define N_VALID "is not a valid ID" 
... 
throw N_valid; 
... 
catch(char *message){ 
fprintf(stderr,"%s",message);} 
+8

정의 #이는 #DEFINE없이 인라인 작동하는 경우,이 가지고있는 코드로 N_VALID를 교체보다 더 이상하지 않는다 "유효한 ID 아니다"사전 processsor 컴파일러 전에 실행으로 N_VALID를 대체 할, 기억 그것과 함께 작동해야합니다. –

+0

그런 것, 그렇습니다. 묻기 전에 해본 적 없니? 어떤 문제가 있습니까? –

+0

@ RoKKennedy : 그것이 작동하는 것을 보는 것이 그것이 좋은 생각이라는 것을 의미하지는 않습니다. 대부분의 현대 컴파일러에서 이것은 "작동"합니다 : struct X {void Y() {cout << "Hi!"; }}; int main() {((X *) (NULL)) -> Y(); }, 당신은 "Hi!" 결과물을 볼 수 있지만보고 싶은 것을 보았다고해서 정의되지 않은 행동 - 토지에 입장하지 않았다는 것을 의미하지는 않습니다. – Bill

답변

0

이 법적하지만 부도덕입니다. 하나의 catch에서 거대한 if 문을 사용하는 대신 클라이언트가 개별적으로 오류를 처리 할 수 ​​있도록 항상 객체를 throw해야합니다.

+0

나는 누군가가 "부도덕 한"코드라고 부르는 것을 들었다고 생각하지 않습니다. –

+1

@AdamRosenfield : 그 의도적으로 쓰기 코드가 확장 어려워 유지 보수가 부도덕하게 말할 것입니다. – Bill

+0

자신과 다른 사람들에게 불필요한 고통과 고통을 초래하고 부적절한 코드를 작성하는 것은 부도덕 한 일입니다. – Joel

1

예.

#define N_VALID "is not a valid ID" 

throw N_VALID; 
throw "is not a valid ID"; 

상기 하부 두 줄

사전 처리가 완료되면, 컴파일러의 눈에 사실상 동일하다.

0

마치 #define 지시어는 응용 프로그램을 컴파일하기 전에 코드의 다른 태그로 태그를 대체하여 사용할 수 있습니다. 이 작업을 수행 할 수있는 경우에 따라서 :

throw "is not a valid ID"; 

당신은이 작업을 수행 할 수 있습니다

throw N_VALID; 
4

을 예, 당신이 const char * 아닌 char *을 던지고있다 것을 제외 : https://ideone.com/UsnitG

#include <iostream> 
using std::cout; using std::endl; 

#define N_VALID "is not a valid ID" 

void function_throws() 
{ 
    throw N_VALID; 
} 

int main() 
{ 
    try 
    { 
     function_throws(); 
    } 
    catch(const char *message) // <= Note the const here! 
    { 
     cout << message << endl; 
    } 
} 

그러나 , Joel은 당신이 이것을하지 말아야한다는 것이 맞습니다. 당신이 정말로 여기에 매크로를 사용할 경우 표준 : : 예외 객체에 대한 인수로 사용하려고 : 그것은 작동해야 https://ideone.com/Dsx1RF

void function_throws() 
{ 
    throw invalid_argument(N_VALID); 
} 

int main() 
{ 
    try 
    { 
     function_throws(); 
    } 
    catch(const invalid_argument& ex) 
    { 
     cout << "invalid_argument: " << ex.what() << endl; 
    } 
} 
+0

좋아,이 같은있는 경우 (...) { 숯에서 errormsg [1044]; strlcat (errormsg, buffer, 1024); strlcat (errormsg, "유효한 ID가 아닙니다"); throw errormsg; 좋아, 내가 코드를 분석하고 충분한 공간을 경우에도, 나는 그것을 없애 싶어, 거기에 버퍼 오버 플로우가있을 수 있고, 그건 내 아이디어 중 하나 – user2406440

0

.

관련 문제