В C, как я ограничиваю объем глобальной переменной в файл, в котором это объявляется?

Рабочая скрипка

Я добился этого вот так;

function isTouchDevice(){
    return true == ("ontouchstart" in window || window.DocumentTouch && document instanceof DocumentTouch);
}

if(isTouchDevice()===true) {
    alert('Touch Device'); //your logic for touch device
}
else {
    alert('Not a Touch Device'); //your logic for non touch device
}

7
задан Metaphile 25 June 2009 в 22:26
поделиться

4 ответа

Вы #included bar.c, что приводит к тому, что препроцессор буквально копирует содержимое bar.c в foo.c до того, как компилятор его коснется.

Попробуйте избавиться включения, но сообщая вашему компилятору скомпилировать оба файла (например, gcc foo.c bar.c ) и смотреть, как он жалуется, как вы ожидаете.

Правка: я полагаю, что основная путаница возникает между компилятором и препроцессор. Языковые правила применяются компилятором. Препроцессор запускается перед компилятором и работает с командами с префиксом #. Все, что делает препроцессор, - это манипулирует обычным текстом. Он не анализирует код и не пытается каким-либо образом интерпретировать значение кода. Директива "#include" очень буквальна - она ​​говорит препроцессору «вставить сюда содержимое этого файла». Вот почему вы обычно используете #include только для файлов .h (заголовков) и размещаете только прототипы функций и объявления внешних переменных в файлах заголовков. В противном случае вам придется компилировать одни и те же функции или определять одни и те же переменные несколько раз, что незаконно.

15
ответ дан 6 December 2019 в 07:52
поделиться

Remove the second include instruction. As it was said above...

Before compiling your code a compiler preprocesses it. In that stage it processes all the instructions starting with '#', like #include, #define and etc.

To see the result of that stage you can just run 'gcc -E ' (if you are using gcc).

0
ответ дан 6 December 2019 в 07:52
поделиться

Это вызвано неправильными терминами. область действия в C не относится к ограничению привязки идентификатора только к одной единице трансляции. Это также не означает, что область действия ограничена одним физическим файлом. Вместо этого область действия означает, что ваш идентификатор является глобальным. Термин файл здесь относится к тексту, который получается в результате обработки всех #include , #define и других директив препроцессора.

В общем, область действия - это только концепция, действующая в пределах одной единицы перевода. Когда задействовано несколько компиляций, начинается связывание.

Если вы объявляете переменную области видимости файла static , тогда она дает внутреннюю связь переменной, что означает, что она не видна за пределами этой единицы перевода.

Если вы не объявляете его статическим явно или если вы объявляете переменную области видимости файла extern , тогда она становится видимой для других единиц перевода: если они объявляют переменную области видимости файла с тот же идентификатор, будет иметь этот идентификатор ссылку на ту же переменную.

В вашем случае включение bar.c в foo.c вставляет определение fileScopeVariable в компилируемую единицу перевода. Таким образом, это видно в этом блоке.

В вашем случае включение bar.c в foo.c вставляет определение fileScopeVariable в компилируемую единицу перевода. Таким образом, это видно в этом блоке.

В вашем случае включение bar.c в foo.c вставляет определение fileScopeVariable в компилируемую единицу перевода. Таким образом, это видно в этом блоке.

6
ответ дан 6 December 2019 в 07:52
поделиться

Don't ever #include a .c file like you are doing there. The language allows it, but C coders just don't do that, so you will confuse the heck out of people if you do it. Most likely including yourself.

"#include" means "Compiler, please go to that other file and tack it to the front of this one before you start compiling my code."

I once lost a whole day in total confusion because one of the vxWorks source files did this. I'm still POed at them over that.

2
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: