سؤال

ما هو سبب التحذير التالية في C++ compilers ؟

لا السطر في نهاية الملف

لماذا يجب أن يكون سطر فارغ في نهاية المصدر/رأس الملف ؟

هل كانت مفيدة؟

المحلول

التفكير في بعض من المشاكل التي يمكن أن تحدث إذا كان هناك أي السطر.وفقا ANSI القياسية على #include من ملف في بداية إدراج الملف بالضبط كما هو إلى الجزء الأمامي من الملف و لا إدراج سطر جديد بعد #include <foo.h> بعد محتويات الملف.حتى إذا قمت بتضمين ملف مع أي السطر في نهاية المطاف إلى محلل سيتم عرضها كما لو كان السطر الأخير من foo.h على نفس السطر مثل السطر الأول من foo.cpp.ما إذا كان السطر الأخير من فو.ساعة كان التعليق دون سطر جديد ؟ الآن أول خط foo.cpp وعلق بها.هذه ليست سوى بعض الأمثلة من أنواع المشاكل التي يمكن أن يرتفع.


فقط أردت أن أشير لأي من الأطراف المهتمة جيمس الإجابة أدناه.في حين سبق الجواب هو لا يزال تصحيح C, C++ القياسية (C++11) تم تغيير حيث أن هذا التحذير لم يعد يجب أن تصدر في حالة استخدام C++ و مترجم مطابقة C++11.

من C++11 القياسية عبر جيمس بعد:

مصدر الملفات الفارغة و التي لا تنتهي في خط حرف ، أو أن ينتهي في خط حرف فورا يسبقه حرف مائل قبل أي مثل هذا الربط ، يجب معالجتها كما لو إضافية جديدة-خط حرف تم إلحاق ملف (C++11 §2.2/1).

نصائح أخرى

شرط أن كل الملف المصدر مع عدم هرب السطر تم إزالتها في C++11.مواصفات الآن ما يلي:

مصدر الملفات الفارغة و التي لا تنتهي في خط حرف ، أو أن ينتهي في خط حرف فورا يسبقه حرف مائل قبل أي مثل هذا الربط ، يجب معالجتها كما لو إضافية جديدة-خط حرف تم إلحاق ملف (C++11 §2.2/1).

مطابقة يجب أن المترجم لم يعد إصدار هذا التحذير (على الأقل ليس عند التحويل البرمجي C++11 واسطة ، إذا كان المترجم له طرق مختلفة تنقيحات اللغة مواصفات).

C++03 القياسية [2.1.1.2] تعلن:

...إذا كان الملف المصدر أن ليست فارغة لا تنتهي في خط حرف ، أو ينتهي في خط حرف على الفور يسبقه حرف مائل قبل أي من هذه الربط يحدث سلوك غير معرف.

الجواب عن "طاعة" هو "لأن C++03 القياسية يقول على سلوك البرنامج لا تنتهي في السطر غير معرف" (بتصرف).

الجواب الغريب هنا هو: http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html.

فإنه لا يشير إلى سطر فارغ ، هو ما إذا كان السطر الأخير (الذي يمكن أن يكون المحتوى في ذلك) هو إنهاء السطر.

معظم برامج تحرير النصوص وضع السطر في نهاية السطر الأخير من الملف ، حتى إذا كان السطر الأخير لا يملك أحد ، هناك خطر من أن الملف تم اقتطاع.ومع ذلك ، هناك أسباب وجيهة لماذا قد لا تريد السطر لذلك هو فقط تحذير وليس خطأ.

#include سيتم استبدال خط مع الحرفي محتويات الملف.إذا كان الملف لا ينتهي السطر الخط التي تحتوي على #include التي سحبت في دمج مع السطر التالي.

أنا باستخدام c-free IDE الإصدار 5.0 في progrm إما من 'c' أو 'ج' اللغة كان الحصول على نفس المشكلة.فقط في نهاية البرنامج أيالسطر الأخير من البرنامج(بعد الأقواس من وظيفة قد يكون الرئيسي أو أي وظيفة) ، اضغط enter-خط لا.سوف يكون بنسبة 1.ثم تنفيذ نفس البرنامج ، وسوف تعمل بدون خطأ.

بالطبع في ممارسة كل مترجم يضيف سطر جديد بعد #include.والحمد لله.– @mxcl

غير محددة C/C++ ولكن ج اللهجة:عند استخدام GL_ARB_shading_language_include التمديد glsl مترجم على OS X يحذرك لا عن مفقود السطر.لذلك يمكنك كتابة MyHeader.h الملف مع رأس الحارس الذي ينتهي مع #endif // __MY_HEADER_H__ وأنت سوف تفقد خط بعد #include "MyHeader.h" بالتأكيد.

لأن السلوك يختلف بين C/C++ والإصدارات إذا كان الملف لا ينتهي جديدة خط.خصوصا سيئة أقدم C++-إصدارات, fx في C++ 03 القياسية يقول (الترجمة مراحل):

إذا كان الملف المصدر أن ليست فارغة لا تنتهي في الخط حرف, أو ينتهي في خط حرف فورا يسبقه مائل حرف سلوك غير معرف.

غير معرف السلوك السيئ:معيار المطابقة مترجم يمكن القيام به أكثر أو أقل ما يريد هنا (إدراج malicous رمز أو أيا كان) - بوضوح سبب التحذير.

في حين أن الوضع أفضل في C++11 انها فكرة جيدة لتجنب الحالات التي يكون فيها سلوك غير معرف في الإصدارات السابقة.C++03 مواصفات أسوأ من C99 التي صريح يحظر مثل هذه الملفات (السلوك ثم يتم تعريف).

هذا التحذير قد تساعد أيضا تشير إلى أن الملف قد تم اقتطاع بطريقة أو بأخرى.صحيح أن المترجم ربما رمي خطأ التحويل على أي حال - لا سيما إذا كان في وسط وظيفة - أو ربما خطأ linker ، ولكن هذه يمكن أن تكون أكثر خفي, و لا يضمن أن تحدث.

بالطبع هذا التحذير أيضا ليست مضمونة إذا كان الملف هو اقتطاع مباشرة بعد السطر, ولكن يمكن أن لا تزال التقاط بعض الحالات أن أخطاء أخرى قد تفوت و يعطي أقوى تلميح إلى مشكلة.

هذا ليس خطأ.انها مجرد تحذير.

فتح الملف في محرر ، انتقل إلى السطر الأخير من الملف واضغط على enter لإضافة سطر فارغ إلى نهاية الملف.

على الرغم من ، إلى جانب ذلك ، يجب أن يكون باستخدام #include <iostream> بدلا من <iostream.h>.ثم وضعها في using std::cout; بعد ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top