이렇게 할 수 있습니까?#define을 만들고 throw에서 사용할 수 있습니까?
#define N_VALID "is not a valid ID"
...
throw N_valid;
...
catch(char *message){
fprintf(stderr,"%s",message);}
이렇게 할 수 있습니까?#define을 만들고 throw에서 사용할 수 있습니까?
#define N_VALID "is not a valid ID"
...
throw N_valid;
...
catch(char *message){
fprintf(stderr,"%s",message);}
예.
#define N_VALID "is not a valid ID"
throw N_VALID;
throw "is not a valid ID";
상기 하부 두 줄
사전 처리가 완료되면, 컴파일러의 눈에 사실상 동일하다.마치 #define 지시어는 응용 프로그램을 컴파일하기 전에 코드의 다른 태그로 태그를 대체하여 사용할 수 있습니다. 이 작업을 수행 할 수있는 경우에 따라서 :
throw "is not a valid ID";
당신은이 작업을 수행 할 수 있습니다
throw N_VALID;
을 예, 당신이 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;
}
}
좋아,이 같은있는 경우 (...) { 숯에서 errormsg [1044]; strlcat (errormsg, buffer, 1024); strlcat (errormsg, "유효한 ID가 아닙니다"); throw errormsg; 좋아, 내가 코드를 분석하고 충분한 공간을 경우에도, 나는 그것을 없애 싶어, 거기에 버퍼 오버 플로우가있을 수 있고, 그건 내 아이디어 중 하나 – user2406440
.
정의 #이는 #DEFINE없이 인라인 작동하는 경우,이 가지고있는 코드로 N_VALID를 교체보다 더 이상하지 않는다 "유효한 ID 아니다"사전 processsor 컴파일러 전에 실행으로 N_VALID를 대체 할, 기억 그것과 함께 작동해야합니다. –
그런 것, 그렇습니다. 묻기 전에 해본 적 없니? 어떤 문제가 있습니까? –
@ RoKKennedy : 그것이 작동하는 것을 보는 것이 그것이 좋은 생각이라는 것을 의미하지는 않습니다. 대부분의 현대 컴파일러에서 이것은 "작동"합니다 : struct X {void Y() {cout << "Hi!"; }}; int main() {((X *) (NULL)) -> Y(); }, 당신은 "Hi!" 결과물을 볼 수 있지만보고 싶은 것을 보았다고해서 정의되지 않은 행동 - 토지에 입장하지 않았다는 것을 의미하지는 않습니다. – Bill