cl.exe(32 бита) и cl.exe(64 бита) имеют одинаковую версию, но почему они не эквивалентны?
Это код, написанный студентом-новичком. Я проверяю, является ли его код неправильным или правильным. И я нашел неправильную точку. Это вызвано несоответствием типов параметров и аргументов.
void make_data(FILE *fp,char,int n);
Это прототип функции. Однако он вызвал функцию с другими аргументами. Как это.
make_data(fin, "input.txt", 10);
Неправильный момент очевиден - он объявил прототип функции неправильно. Сначала я скомпилировал этот код с помощью cl.exe(64 бита) и запустил программу. Он был остановлен во время выполнения.
Однако, когда я скомпилировал тот же файл с помощью cl.exe(32 бита), не возникла ошибка во время выполнения. Конечно, было много предупреждений о компиляции, но, по крайней мере, все было выполнено хорошо. Похоже, что cl.exe(32 бита) более терпим, чем 64-битный. Но они имеют одинаковую версию.(16.00.30319.01). Тогда почему они ведут себя по-разному?
Я понимаю, что это неопределенное поведение. Я знаю, что компилятор Visual C может сильно отличаться от gcc - потому что язык C не определяет все детали. Я хочу знать, почему компилятор в 32-битной и 64-битной системах должен быть таким, как этот.
1 ответ
Код, который вы показываете, является допустимым C. Это бессмысленно, но что касается семантики C, он действителен и не вызывает UB.
Полный пример:
#include <stdio.h>
void make_data(FILE *fp, char a, int n) {
printf("%p %c %d\n", fp, a, n);
}
int main()
{
FILE * fin = NULL;
make_data(fin, "input.txt", 10);
}
Пример вывода:
0x0 2 10
Что вы нам не говорите, так это то, что декларации разные в разных единицах перевода. Например в file1.c
, есть void make_data(FILE*, char, int);
декларация, а в file2.c
есть void make_data(FILE*, char*, int) { ... }
определение. В 64-битной системе char
а также char*
передаются по-другому, и это вызывает сбой.
Итак, повторюсь, проблема в том, что вы не правильно определили проблему - несмотря на то, что она полностью предотвратима, если вы только следовали инструкциям. Пожалуйста, прочитайте и поймите, как задать страницу хорошего вопроса. Это на вас и только на вас, чтобы минимизировать проблему и иметь возможность воспроизвести ее до того, как задавать вопрос.