2012-06-15 2 views
0

Мне интересно, может ли условный оператор фактически препятствовать работе другого несвязанного кода. Например ниже:Могут ли условные операции и фигурные скобки влиять на код?

typedef char WCHAR_T; 
#define STRLEN(x) strlen(x) 
if (argc > 2) 
{ 
    WCHAR *pFileName = argv[1]; 
    basic_string <WCHAR> strFileName(pFileName, STRLEN(pFileName)); 
} 

В коде выше, pFileName, ARGV [1] и strFileName не имеют ничего общего со сравнением argc > 2. Предположим, что аргументы командной строки отлично. Однако этот код не будет работать с этим сравнением. Кроме того, даже если я изменил код на следующий формат:

typedef char WCHAR_T; 
#define STRLEN(x) strlen(x) 

{ 
    WCHAR *pFileName = argv[1]; 
    basic_string <WCHAR> strFileName(pFileName, STRLEN(pFileName)); 
} 

Все еще не работает. EDIT: «Не работает», я имею в виду, что компилятор дает сообщение об ошибке, такое как «strFileName» не было объявлено, что означает, что это объявление вообще не запускалось.

Я понятия не имею, почему фигурные скобки окажут такое большое влияние на код. Когда я избавлюсь от фигурных скобок, код работает как волшебство ... Может ли кто-нибудь объяснить это, пожалуйста? Благодарю.

+1

Что именно вы имеете в виду под «не работает»? – MRAB

+0

Пожалуйста, обратитесь к моему отредактированному вопросу, спасибо. –

ответ

1

Я думаю, вы пытаетесь использовать переменную strFileName откуда-то вне брекетов, что невозможно.

{ и } фигурные скобки определяют блок, а переменные, объявленные внутри, существуют только внутри этого блока. обходной путь будет объявить strFileName вне блока и присвоить это значение внутри

typedef char WCHAR_T; 
#define STRLEN(x) strlen(x) 

basic_string <WCHAR> strFileName; 

if (argc > 2) 
{ 
    WCHAR *pFileName = argv[1]; 
    strFileName.assign(pFileName, STRLEN(pFileName)); 
} 

std::cout << strFileName << std::endl; // should work now 
+0

Ваше объяснение и пример очень полезны, спасибо. –

6

Потому что strFileName существует только в фигурных скобках. Скобки определяют область действия, локальные переменные известны только в пределах области, в которой они определены.

0

Я вижу определение для WCHAR_T, но то, что используется в коде, это WCHAR. Определяется ли WCHAR где угодно?

Смежные вопросы