2012-01-08 2 views
3

저는 일부 레거시 C 코드를 작업 중이며 이상한 두 매크로 정의가 있습니다. 그들은 올바르게 보이지 않으며 일부 컴파일러 경고 (경고 : 쉼표 표현의 왼쪽 피연산자는 아무런 영향을 미치지 않습니다.)에 대한 책임이 있습니다. 마침내 이러한 매크로를 추적하는 데 몇 시간이 걸렸습니다.이 이상한 매크로 정의는 무엇을 의미합니까? (그리고 그것도 맞습니까?)

누구든지 올바른지 (의심 스럽습니다), 그렇지 않은 경우 어떻게 해결할 수 있습니까?

#define MAX_MEMORY_BLOCK (sizeof(size_t)==2,65535,2147483647) 
#define MAX_ARRAY_SIZE (sizeof(size_t)==2,16384,1073741824) 
+0

코드에서 어떤 문맥에서 사용됩니까? –

+0

@CodyGray 나는 그렇게 생각하지 않는다 - 그것들은 분명히 쉼표로 구분되는 값이다. 나에게 이해가 가지 않는다. –

+2

아마도 원래의 의도는'(sizeof (size_t) == 2? a : b)'였을 것입니까? – Mat

답변

5

쉼표 연산자가 포함되어 있습니다. 그들은 그래서 마지막 값 '카운트'에 해당 : 몇 가지 현대적인 시스템은하지만 어디 sizeof(size_t) == 2 (있다, 그러나

#define MAX_MEMORY_BLOCK (sizeof(size_t)==2 ? 65535 : 2147483647) 
#define MAX_ARRAY_SIZE (sizeof(size_t)==2 ? 16384 : 1073741824) 

:

#define MAX_MEMORY_BLOCK (2147483647) 
#define MAX_ARRAY_SIZE (1073741824) 

또는 누군가가 삼항 연산자가 ?:를 사용하는 것을 잊었다 아마도 임베디드 컴퓨팅 세계에서 특히 그렇습니다).

+0

그래, 삼항 연산자는 실제로 의미가 있습니다. 그것이 문제를 일으키지 않는 한, 그것은 아마 중요하지 않습니다. –

+0

Jonathan : 왜 그렇게 높은 평판 점수를 얻었는지 알 수 있습니다. 나는 누락 된 삼항 연산자에 대해 결코 생각하지 않을 것이다. 매크로가 마침내 이제는 의미가 있습니다. 그에 따라 코드를 수정했습니다. 감사! –

2

이 정말이하는 일이다 :

1, 65535, 2147483647 
1, 16384, 1073741824 

또는 현대 컴파일러에서

0, 65535, 2147483647 
0, 16384, 1073741824 

.

처음 두 표현식이 아무 것도하지 않기 때문에 불평합니다. 일반적으로 작업을 쉼표로 구분하면 작업이 동시에 발생하기를 원하기 때문입니다. (사실, 나는 그들이 매우 전혀 사용 표시되지 않습니다.)

당신이 경고를 없애 싶은 경우에 당신은 아마로 변경할 수 :

#define MAX_MEMORY_BLOCK 2147483647 
#define MAX_ARRAY_SIZE 1073741824 

아니에요 그 값이 실제로 의미가 있는지 확인하십시오.